instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
Я не понимаю, как определение типа <*>
может проверять тип.
С левой стороны f
ограничивается подписью <*>
, как в определении Applicative
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
.