Control.Monad.List.ListT的文檔聲明它「不會產生monad,除非參數monad是可交換的。」如何確定monad是否可交換?
如何確定monad是否可交換?有沒有CommutativeMonad類型類?應該有嗎?
尤其是Control.Monad.RWS.Lazy.RWS是一個交換單子嗎?
Control.Monad.List.ListT的文檔聲明它「不會產生monad,除非參數monad是可交換的。」如何確定monad是否可交換?
如何確定monad是否可交換?有沒有CommutativeMonad類型類?應該有嗎?
尤其是Control.Monad.RWS.Lazy.RWS是一個交換單子嗎?
一般來說,如果表達式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類型類。
不,沒有CommutativeMonad類。 RWS不可交換。對於一個monad是可交換的,你必須能夠在沒有任何改變的情況下重新排列效果。
我會說,相反,大多數monad是不可交換的,除了'Maybe'和'Reader'之外,你能舉出任何例子嗎? – Tarrasch 2011-05-22 19:10:13
我經常使用MonadSupply和Random,當然還有某些無序數據結構(如multisets)的實現。但這是一個公平的批評。 – JeremyKun 2011-05-22 19:35:52
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