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

时间:2015-02-23 18:56:56

标签: haskell applicative monoids

来自Monoid a => Monoid (Const a b)的{​​{3}}仿函数有Control.Applicative个实例。还有一个实例Monoid m => Applicative (Const m)

因此,我希望还有一个实例Monoid m => Alternative (Const m)Monoid的实例重合。这只是一个应该修复的遗漏,还是有更深层的原因?

1 个答案:

答案 0 :(得分:5)

我相信更深层次的原因。虽然Alternative似乎没有规范的规则,但为了使Alternative有意义,Alternative与其Applicative操作之间肯定存在关联(否则它只是一个任意的幺半群。)

This answerConfused by the meaning of the 'Alternative' type class and its relationship to other type classes声明了这些法律

  
      
  1. 正确的分配(<*>): (f <|> g) <*> a = (f <*> a) <|> (g <*> a)
  2.   
  3. 正确吸收(适用于<*>): empty <*> a = empty
  4.   
  5. 左派分布(fmap): f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
  6.   
  7. 左吸收(fmap): f <$> empty = empty
  8.   

对我来说很有意义。粗略地说,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

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

另见: