我一直在通过 典型的经典百科全书学习类型课程。我卡住了理解 Alternative
(和 MonadPlus
,就此而言)。
我现在的问题是:
Wikipedia 说,“ Alternative 类是针对 Applicative 函子的,它也有一个幺半群结构。”我不明白 Alternative 不是和 Monoid 完全不同吗?也就是说,我理解 Alternative 类型类的要点是在两个事物之间进行选择,而我理解 Monoid 是关于组合事物的。
为什么 Alternative 需要 empty
方法/成员?我可能是错的,但它似乎没有被使用在所有... 至少在 密码,我可以找到。它似乎不符合这门课的主题——如果我有两样东西,并且需要选择其中一样,那么我为什么需要一个“ em pty”呢?
为什么 Alternative 类型类需要 Applicative 约束,为什么它需要一种 * -> *
?为什么不只有 <|> :: a -> a -> a
?所有的实例仍然可以用同样的方式实现... ... 我想(不确定)。它能提供什么 Monoid 没有的价值?
MonadPlus
类型类的意义是什么?难道我不能通过同时使用 Monad
和 Alternative
来解锁它所有的优点吗?为什么不扔了它?(我确信我错了,但我没有任何反例)
希望所有这些问题都是连贯的... !
赏金更新:@Antal 的回答是一个很好的开始,但 Q3仍然开放: Alternative 提供了什么 Monoid 没有的东西?我认为 这个答案不能令人满意,因为它缺乏具体的例子,而且我们还具体讨论了 Alternative 的更高的善意是如何将它与 Monoid 区分开来的。
如果要把应用效应和 Monoid 的行为结合起来,为什么不只是:
liftA2 mappend
这对我来说更加令人困惑,因为许多 Monoid 实例与 Alternative 实例完全相同。
这就是为什么我在寻找 具体例子,它展示了为什么 Alternative 是必要的,以及它与 Monoid 如何不同——或意味着什么不同。