来自Monoid a => Monoid (Const a b)
的{{3}}仿函数有Control.Applicative
个实例。还有一个实例Monoid m => Applicative (Const m)
。
因此,我希望还有一个实例Monoid m => Alternative (Const m)
与Monoid
的实例重合。这只是一个应该修复的遗漏,还是有更深层的原因?
答案 0 :(得分:5)
我相信是更深层次的原因。虽然Alternative
似乎没有规范的规则,但为了使Alternative
有意义,Alternative
与其Applicative
操作之间肯定存在关联(否则它只是一个任意的幺半群。)
This answer至Confused by the meaning of the 'Alternative' type class and its relationship to other type classes声明了这些法律
- 正确的分配(
<*>
):(f <|> g) <*> a = (f <*> a) <|> (g <*> a)
- 正确吸收(适用于
<*>
):empty <*> a = empty
- 左派分布(
fmap
):f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
- 左吸收(
醇>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
不等于empty = Const mempty
。同样,1。失败,一个简单的反例就是设置f = Const (Sum 1); g = Const (Sum 1) ; a = Const (Sum 1)
。
另见: