haskell - segun - ¿Cómo puedo saber si una mónada es conmutativa?
monadas leibniz (2)
La documentación de Control.Monad.List.ListT indica que "no produce una mónada a menos que el argumento mónada sea conmutativo".
¿Cómo puedo saber si una mónada es conmutativa? ¿Hay una clase de tipos de CommutativeMonad? ¿Debería haber?
En particular, ¿es Control.Monad.RWS.Lazy.RWS una mónada conmutativa?
No, no hay una clase de CommutativeMonad. Y RWS no es conmutativo. Para que una mónada sea conmutativa, debes poder reordenar los efectos sin que cambie nada.
En general, una mónada es conmutativa si la expresión a >>= /x -> b >>= /y -> fxy
es equivalente a b >>= /y -> a >>= /x -> fxy
.
En otras palabras, es conmutativo si el orden de los efectos secundarios no es importante. Podemos sustituir 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
La mayoría de las mónadas comunes son conmutativas, pero puede determinar si una mónada en particular es conmutativa observando el diseño y haciendo clic en él, o escribiendo un pequeño programa para probarlo con las expresiones apropiadas (que naturalmente dependen de la naturaleza de la mónada) . Por lo que sé, no hay una clase de tipos de CommutativeMonad.