Классы типов стандартной-библиотеки Haskell MonadPlus
, Alternative
и Monoid
предоставляют два метода с практически одинаковой семантикой:
mzero
], empty
или mempty
.a -> a -> a
, который объединяет значения в классе типов вместе :mplus
, <|>
или mappend
.Все три определяют эти законы, которым должны подчиняться экземпляры.:
mempty `mappend` x = x
x `mappend` mempty = x
Таким образом, кажется, что все три класса типов предоставляют одни и те же одни и те же методы.
(Alternative
также предоставляет some
и many
, но их определений по умолчанию обычно достаточно, и поэтому они не слишком важны с точки зрения этого вопроса.)
Итак, мой вопрос::почему эти три чрезвычайно похожих класса? Есть ли какая-то реальная разница между ними, помимо их различных ограничений суперкласса?