Аппликативная реализация моноида 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 bConst x yявляется конструкторомConst, примененным к значению типаx, это означаетf :: m(иv :: m), и мы знаемMonoid mиз контекста экземпляра.