2011-05-22 20 views

Respuesta

11

En general, una mónada es conmutativa si la expresión a >>= \x -> b >>= \y -> f x y es equivalente a b >>= \y -> a >>= \x -> f x y.

En otras palabras, es conmutativo si el orden de los efectos secundarios no es importante. Podemos reemplazar la expresión:

do a <- ma 
    b <- mb 
    f a b 

con uno que cambia los argumentos.

do b <- mb 
    a <- ma 
    f a b 

más Muchos mónadas comunes son conmutativas, pero se puede determinar si una mónada particular es conmutativa, ya sea mirando el diseño y logicking, o escribiendo un pequeño programa para probarlo con expresiones adecuadas (que naturalmente depende de la naturaleza de la mónada). Hasta donde yo sé, no existe una clase de tipo CommutativeMonad.

+6

Yo diría lo contrario, la mayoría de las mónadas no son conmutativas, ¿puede nombrar algunos ejemplos además de 'Maybe' y' Reader'? – Tarrasch

+1

Uso MonadSupply y Random con bastante frecuencia, y por supuesto están las implementaciones de ciertas estructuras de datos no ordenados como multisets. Pero esa es una crítica justa. – JeremyKun

+0

MonadSupply no parece ser conmutativo según su definición. 'runSupply (do {a <- supply; b <- supply; return (a - b)}) [1,2]' → '-1' pero' runSupply (do {b <- supply; a <- supply; return (a - b)}) [1,2] '→' 1'. ¿Hay un error en mi razonamiento? – dave4420

5

No, no hay clase CommutativeMonad. Y RWS no es conmutativo. Para que una mónada sea conmutativa, debe poder reordenar los efectos sin cambiar nada.

Cuestiones relacionadas