18

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

  1. 我如何确定一个单子是否可交换?有 CommutativeMonad 类型类吗?应该有吗?

  2. 特别是,Control.Monad.RWS.Lazy.RWS是可交换的单子吗?

4

2 回答 2

12

a >>= \x -> b >>= \y -> f x y通常,如果表达式等价于,则 monad 是可交换的b >>= \y -> a >>= \x -> f x y

换句话说,如果副作用的顺序不重要,它是可交换的。我们可以替换表达式:

do a <- ma
   b <- mb
   f a b

与一个切换论点。

do b <- mb
   a <- ma
   f a b

大多数常见的 monad 是可交换的,但是您可以通过查看设计并对其进行逻辑化,或者通过编写一个小程序来使用适当的表达式对其进行测试(这自然取决于 monad 的性质)来确定特定的 monad 是否可交换. 据我所知,没有 CommutativeMonad 类型类。

于 2011-05-22T19:08:29.337 回答
5

不,没有 CommutativeMonad 类。并且 RWS 不可交换。要使 monad 可交换,您必须能够在不改变任何内容的情况下重新排序效果。

于 2011-05-22T19:04:04.657 回答