Аппликативная реализация моноида Const
instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
Я не понимаю, как можно определение <*>
типа-проверить.
С левой стороны f
ограничена сигнатурой <*>
, как и в определении Аппликативного
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
После изменения имен на текущую ситуацию:
(<*>) :: c (m -> b) -> c m -> c b
=> f :: m -> *
.
В левой части f
находится [первый] параметр mappend
.
Из определения моноида
class Monoid a where
mempty :: a
-- ^ Identity of 'mappend'
mappend :: a -> a -> a
После изменения имен на текущие ситуация:
mappend :: m -> m -> m
=> f :: m
.
2 ответа:
После изменения имен на текущую ситуацию:
(<*>) :: c (m -> b) -> c m -> c b
=>
f :: m -> *
.Не совсем. После изменения имен на текущую ситуацию:
Поскольку значение типа(<*>) :: Const m (a -> b) -> Const m a -> Const m b
Const x y
является конструкторомConst
, примененным к значению типаx
, это означаетf :: m
(иv :: m
), и мы знаемMonoid m
из контекста экземпляра.