Control.Monad.List.ListTのドキュメントには、「引数のモナドが交換可能でない限り、モナドを生成しない」と記載されています。
モナドが交換可能かどうかを調べるにはどうすればよいですか? CommutativeMonad 型クラスはありますか? あるべきですか?
特に、Control.Monad.RWS.Lazy.RWSは可換モナドですか?
Control.Monad.List.ListTのドキュメントには、「引数のモナドが交換可能でない限り、モナドを生成しない」と記載されています。
モナドが交換可能かどうかを調べるにはどうすればよいですか? CommutativeMonad 型クラスはありますか? あるべきですか?
特に、Control.Monad.RWS.Lazy.RWSは可換モナドですか?
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 型クラスはありません。
いいえ、CommutativeMonad クラスはありません。また、RWS は可換ではありません。モナドが交換可能であるためには、何も変更せずに効果を並べ替えることができなければなりません。