最佳答案
标准库 Haskell 类型类 MonadPlus
、 Alternative
和 Monoid
各自提供了两种语义基本相同的方法:
mzero
、 empty
或 mempty
。a -> a -> a
: mplus
、 <|>
或 mappend
。这三项法律都具体规定了哪些情况应当遵守:
mempty `mappend` x = x
x `mappend` mempty = x
因此,这三个类型类似乎都提供了 一样方法。
(Alternative
也提供了 some
和 many
,但是它们的默认定义通常已经足够了,所以在这个问题上它们并不太重要。)
因此,我的疑问是: 为什么有这三个极其相似的类?除了不同的超类约束之外,它们之间还有什么真正的区别吗?