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是 的 [first] 参数mappend

从 Monoid 的定义

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

将名称更改为当前情况后:

        mappend :: m -> m -> m

=> f :: m

4

2 回答 2

6
(<*>) :: 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

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

于 2015-11-23T18:33:15.380 回答
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的构造函数,这意味着(and ),我们从实例上下文中知道。Constxf :: mv :: mMonoid m

于 2015-11-23T18:30:36.873 回答