4
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.

4

2 に答える 2

5

名前を現在の状況に変更した後:

(<*>) :: c (m -> b) -> c m -> c b

=> f :: m -> *.

そうではありません。名前を現在の状況に変更した後:

(<*>) :: Const m (a -> b) -> Const m a -> Const m b

type の値は typeの値に適用されるConst x yコンストラクターであるため、これは(および) を意味し、インスタンス コンテキストからわかります。Constxf :: mv :: mMonoid m

于 2015-11-23T18:30:36.873 に答える