Control.Monad.List.ListT的文档声明它“除非参数monad是可交换的,否则不会产生monad。”
如何判断monad是否可交换?是否存在CommutativeMonad类型类?应该有吗?
特别是,Control.Monad.RWS.Lazy.RWS是一个可交换的monad?
答案 0 :(得分:12)
通常,如果表达式a >>= \x -> b >>= \y -> f x y
等同于b >>= \y -> a >>= \x -> f x y
,则monad是可交换的。
换句话说,如果副作用的顺序不重要,则它是可交换的。我们可以替换表达式:
do a <- ma
b <- mb
f a b
用一个切换参数。
do b <- mb
a <- ma
f a b
大多数许多常见的monad都是可交换的,但你可以通过查看设计和记录它来确定特定的monad是否可交换,或者通过编写一个小程序来用适当的表达式来测试它(这自然取决于monad的性质)。据我所知,没有CommutativeMonad类型类。
答案 1 :(得分:5)
不,没有CommutativeMonad类。 RWS不是可交换的。对于monad是可交换的,你必须能够重新排序效果而不需要任何改变。