Как мне узнать, является ли монада коммутативной? - PullRequest
18 голосов
/ 22 мая 2011

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

  1. Как узнать, является ли монада коммутативной? Есть ли класс типов CommulativeMonad? Должно ли быть?

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

Ответы [ 2 ]

12 голосов
/ 22 мая 2011

Обычно монада коммутативна, если выражение 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.

5 голосов
/ 22 мая 2011

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

...