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