标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义: 空值:mzero,empty或mempty。 操作a -> a -> a:在该类型类联接值加在一起mplus,<|>或mappend。 这三个规则均指定了实例应遵循的以下法律: mempty `mappend` x = x x `mappend` mempty = x 因此,似乎三个类型类都提供相同的方法。 (Alternative也提供some和many,但是它们的默认定义通常就足够了,因此,在这个问题上它们并不是太重要。) 所以,我的查询是:为什么这三个类非常相似?除了它们不同的超类约束之外,它们之间是否还有真正的区别?