Как мне узнать, является ли монада коммутативной?
В документации для Control.Monad.List.ListT говорится, что он "не дает монады, если только аргументная монада коммутативна".
Как мне узнать, является ли монада коммутативной? Есть ли класс типов CommulativeMonad? Должно ли быть?
В частности, является ли 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 не коммутативен. Чтобы монада была коммутативной, вы должны иметь возможность изменять порядок эффектов без каких-либо изменений.