为什么'Control.Applicative.Const'没有'Alternative'实例

mei*_*rsi 14 haskell applicative monoids

有一个实例Monoid a => Monoid (Const a b)Const从仿函数Control.Applicative.还有一个例子Monoid m => Applicative (Const m).

因此,我希望还有一个实例Monoid m => Alternative (Const m)与之相符Monoid.这只是一个应该修复的遗漏,还是有更深层次的原因?

Pet*_*lák 5

我相信一个更深层次的原因.虽然似乎没有规范的规则Alternative,但为了Alternative理解,肯定应该是Alternative它和它的Applicative操作之间的关系(否则它只是一个任意的幺半群.)

这个答案由'Alternative'类型类的含义及其与其他类型类的关系引起的混淆表明了这些定律

  1. 正确的分配性<*>:  (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
  2. 正确吸收(for <*>):  empty <*> a = empty
  3. 左分配(fmap):  f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
  4. 左吸(用于fmap):  f <$> empty = empty

这对我来说很有意义.粗略地说,empty<|>pure<$>/ <*>什么0和+是1*.

现在,如果我们添加的实例Monoid m => Alternative (Const m)Monoid/的实例相符Applicative,则右边的法则不成立.

例如,2.失败,因为

empty <*> (Const x)
= Const mempty <*> Const x    -- by the suggested definition of Alternative
= Const $ mempty `mappend` x  -- by the definition of <*> for COnst
= Const x                     -- by monoid laws
Run Code Online (Sandbox Code Playgroud)

这不等于empty = Const mempty.同样,1.失败,一个简单的反例就是设置f = Const (Sum 1); g = Const (Sum 1) ; a = Const (Sum 1).

也可以看看: