Обычно монада коммутативна, если выражение a >>= \x -> b >>= \y -> f x y
эквивалентно b >>= \y -> a >>= \x -> f x y
.
Другими словами, коммутативно, если порядок побочных эффектов не важен. Мы можем заменить выражение:
do a <- ma
b <- mb
f a b
с одним, который переключает аргументы.
do b <- mb
a <- ma
f a b
Большинство Многие распространенные монады являются коммутативными, но вы можете определить, является ли конкретная монада коммутативной, либо взглянув на схему и сделав ее логику, либо написав небольшую программу для проверки ее с помощью соответствующих выражений (которые естественно зависит от характера монады). Насколько я знаю, нет класса типов CommulativeMonad.