2011-05-22 67 views

回答

11

一般来说,如果表达式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 

许多常见的单子是可交换的,但你可以决定一个特定的单子是要么看设计和logicking是可交换的,也可以通过写一个小程序,用适当的表达式来测试它(这自然取决于monad的性质)。据我所知,没有CommutativeMonad类型类。

+6

我会说,相反,大多数monad是不可交换的,除了'Maybe'和'Reader'之外,你能举出任何例子吗? – Tarrasch 2011-05-22 19:10:13

+1

我经常使用MonadSupply和Random,当然还有某些无序数据结构(如multisets)的实现。但这是一个公平的批评。 – JeremyKun 2011-05-22 19:35:52

+0

MonadSupply似乎不符合你的定义。 'runSupply(do {a < - supply; b < - supply; return(a - b)})[1,2]'→'-1'但是'runSupply(do {b < - supply; a < - supply;返回(a - b)})[1,2]'→'1'。我的推理有错吗? – dave4420 2011-05-22 19:49:17

5

不,没有CommutativeMonad类。 RWS不可交换。对于一个monad是可交换的,你必须能够在没有任何改变的情况下重新排列效果。