¿Distinción entre las clases de tipos MonadPlus, Alternativa y Monoide?

Las clases de tipos de Haskell de la biblioteca estándarMonadPlus, AlternativeyMonoid Cada uno proporciona dos métodos con esencialmente la misma semántica:

Un valor vacío:mzero, emptyomempty.Un operadora -> a -> a que une valores en la clase de tipos:mplus, <|>omappend.

Los tres especifican estas leyes a las que deben adherirse las instancias:

<code>mempty `mappend` x = x
x `mappend` mempty = x
</code>

Por lo tanto, parece que las tres clases de tipos están proporcionando lamismo metodos

(Alternative también proveesome ymany, pero sus definiciones predeterminadas son generalmente suficientes, y por lo tanto no son demasiado importantes en términos de esta pregunta.)

Entonces, mi consulta es: ¿por qué tienen estas tres clases extremadamente similares? ¿Hay alguna diferencia real entre ellos, además de sus diferentes restricciones de superclase?

Respuestas a la pregunta(1)

Su respuesta a la pregunta