Rozróżnienie między typami MonadPlus, Alternative i Monoid?
Klasy Haskella w bibliotece standardowejMonadPlus
, Alternative
, iMonoid
każdy zapewnia dwie metody z zasadniczo tą samą semantyką:
mzero
, empty
lubmempty
.Operatora -> a -> a
który łączy wartości w typie klasy razem:mplus
, <|>
lubmappend
.Wszystkie trzy określają te prawa, do których instancje powinny się stosować:
<code>mempty `mappend` x = x x `mappend` mempty = x </code>
Tak więc wydaje się, że wszystkie trzy typy zapewniająpodobnie metody.
(Alternative
zapewnia równieżsome
imany
, ale ich domyślne definicje są zazwyczaj wystarczające, a więc nie są zbyt ważne z punktu widzenia tego pytania.)
Więc moje pytanie brzmi: dlaczego te trzy bardzo podobne klasy? Czy jest między nimi jakaś realna różnica, poza ich różnymi ograniczeniami superklasy?