Control.Monad.List.ListT的文档声明它“除非参数 monad 是可交换的,否则不会产生 monad”。
我如何确定一个单子是否可交换?有 CommutativeMonad 类型类吗?应该有吗?
特别是,Control.Monad.RWS.Lazy.RWS是可交换的单子吗?
Control.Monad.List.ListT的文档声明它“除非参数 monad 是可交换的,否则不会产生 monad”。
我如何确定一个单子是否可交换?有 CommutativeMonad 类型类吗?应该有吗?
特别是,Control.Monad.RWS.Lazy.RWS是可交换的单子吗?
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 类型类。
不,没有 CommutativeMonad 类。并且 RWS 不可交换。要使 monad 可交换,您必须能够在不改变任何内容的情况下重新排序效果。