有一个仿函数Monoid a => Monoid (Const a b)
的实例Const
来自Control.Applicative
。还有一个例子Monoid m => Applicative (Const m)
。
因此,我希望还有一个Monoid m => Alternative (Const m)
与 for 相一致的实例Monoid
。这只是一个应该修复的遗漏,还是有更深层次的原因?
有一个仿函数Monoid a => Monoid (Const a b)
的实例Const
来自Control.Applicative
。还有一个例子Monoid m => Applicative (Const m)
。
因此,我希望还有一个Monoid m => Alternative (Const m)
与 for 相一致的实例Monoid
。这只是一个应该修复的遗漏,还是有更深层次的原因?
我相信有更深层次的原因。虽然似乎没有规范的规则集,但Alternative
为了Alternative
有意义,Alternative
它和它的Applicative
操作之间肯定应该存在关系(否则它只是一个任意的幺半群。)
这个对“替代”类型类的含义及其与其他类型类的关系感到困惑的答案说明了这些法律
- (的)右分配
<*>
:(f <|> g) <*> a = (f <*> a) <|> (g <*> a)
- 右吸收(对于
<*>
):empty <*> a = empty
- 左分布(的
fmap
):f <$> (a <|> b) = (f <$> a) <|> (f <$> b)
- 左吸收(对于
fmap
):f <$> empty = empty
这对我来说很有意义。粗略地说,empty
and <|>
are to pure
and <$>
/ <*>
what 0 and + are to 1 and *.
现在,如果我们添加与/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)
。
也可以看看: