Const Monoid 的应用实现

Applicative implementation of Const Monoid

instance Monoid m => Applicative (Const m) where
    pure _ = Const mempty
    Const f <*> Const v = Const (f `mappend` v)

我不明白 <*> type-check.

的定义如何

左侧 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 -> *.

左边fmappend的[第一个]参数。

来自Monoid的定义

class Monoid a where
        mempty  :: a
        -- ^ Identity of 'mappend'
        mappend :: a -> a -> a

改名后现在的情况:

        mappend :: m -> m -> m

=> f :: m.

After changing the names to the current situation:

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

=> f :: m -> *.

不完全是。改名后现在的情况:

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

由于 Const x y 类型的值是应用于 x 类型值的构造函数 Const,这意味着 f :: m(和 v :: m) ,我们从实例上下文中知道 Monoid m

(<*>) :: f         (a->b) -> f         a -> f         b
      ≡  (Const m) (a->b) -> (Const m) a -> (Const m) b
      ≡  Const m (a->b) -> Const m a -> Const m b
      ≅        m        ->       m   ->       m

这是 <>(又名 mappend)的签名。