¿Distinción entre las clases de tipos MonadPlus, Alternativa y Monoide?
Las clases de tipos de Haskell de la biblioteca estándarMonadPlus
, Alternative
yMonoid
Cada uno proporciona dos métodos con esencialmente la misma semántica:
mzero
, empty
omempty
.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?