2011-05-22 64 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是可交換的,你必須能夠在沒有任何改變的情況下重新排列效果。