我怎样才能知道monad是否可交换?

时间:2011-05-22 18:47:53

标签: haskell monads commutativity

Control.Monad.List.ListT的文档声明它“除非参数monad是可交换的,否则不会产生monad。”

  1. 如何判断monad是否可交换?是否存在CommutativeMonad类型类?应该有吗?

  2. 特别是,Control.Monad.RWS.Lazy.RWS是一个可交换的monad?

2 个答案:

答案 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是可交换的,你必须能够重新排序效果而不需要任何改变。