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.这只是一个应该修复的遗漏,还是有更深层次的原因?
我相信是一个更深层次的原因.虽然似乎没有规范的规则Alternative,但为了Alternative理解,肯定应该是Alternative它和它的Applicative操作之间的关系(否则它只是一个任意的幺半群.)
这个答案由'Alternative'类型类的含义及其与其他类型类的关系引起的混淆表明了这些定律
- 正确的分配性
<*>:(f <|> g) <*> a = (f <*> a) <|> (g <*> a)- 正确吸收(for
<*>):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).
也可以看看: