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