Ответ 1
В общем случае монада коммутативна, если выражение 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
Большинство Многие обычные монады являются коммутативными, но вы можете определить, является ли конкретная монада коммутативной, если посмотреть на дизайн и запустить ее, или написать небольшую программу для проверки ее соответствующими выражениями ( которые, естественно, зависят от природы монады). Насколько я знаю, нет класса CommutativeMonad.