Подтвердить что ты не робот

Как узнать, является ли монада коммутативной?

Документация для Control.Monad.List.ListT утверждает, что она "не дает монаду, если аргумент monad не является коммутативным".

  • Как узнать, является ли монада коммутативной? Существует ли класс CommutativeMonad? Должно ли быть?

  • В частности, Control.Monad.RWS.Lazy.RWS коммутативная монада?

4b9b3361

Ответ 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.

Ответ 2

Нет, нет класса CommutativeMonad. И RWS не является коммутативным. Чтобы монада была коммутативной, вы должны иметь возможность изменять порядок действий без каких-либо изменений.