In general, a monad is commutative if the expression a >>= \x -> b >>= \y -> f x y
is equivalent to b >>= \y -> a >>= \x -> f x y
.
In other words, it is commutative if the order of side effects is not important. We can replace the expression:
do a <- ma
b <- mb
f a b
with one which switches the arguments.
do b <- mb
a <- ma
f a b
Most Many common monads are commutative, but you can determine if a particular monad is commutative by either looking at the design and logicking it, or by writing a small program to test it with appropriate expressions (which naturally depend on the nature of the monad). As far as I know there is no CommutativeMonad typeclass.
Maybe
andReader
? – Siltstone