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ą:

Pusta wartość:mzero, emptylubmempty.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?

questionAnswers(1)

yourAnswerToTheQuestion