instance Monoid m => Applicative (Const m) where
pure _ = Const mempty
Const f <*> Const v = Const (f `mappend` v)
<*>
タイプチェックの定義がどのようにできるのかわかりません。
左側は Applicative の定義のように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
.