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

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

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

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

2 ответа

Решение

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

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

Другие вопросы по тегам