标准库Haskelltypes类MonadPlus , Alternative和Monoid每个都提供两种基本相同的语义: 空值: mzero , empty或mempty 。 运算符a -> a -> a将mplus中的值连接在一起: mplus , <|>或mappend 。 所有这三个都规定了这些实例应遵守的法律: mempty `mappend` x = x x `mappend` mempty = x 因此,三个types类似乎都提供了相同的方法。 ( Alternative也提供了some和many ,但是它们的默认定义通常是足够的,所以它们在这个问题上不是太重要。) 所以,我的问题是:为什么有这三个极其相似的类? 他们之间有什么真正的区别,除了他们不同的超类限制吗?