Control.Monad.List.ListT 的文档说明:“除非参数单子循环,否则不会产生单子。”
如何确定单子是否具有交换性? 是否有 CommmutativeMonad 类型类? 是否应该有?
特别地,Control.Monad.RWS.Lazy.RWS 是一种可交换的单子吗?
Control.Monad.List.ListT 的文档说明:“除非参数单子循环,否则不会产生单子。”
如何确定单子是否具有交换性? 是否有 CommmutativeMonad 类型类? 是否应该有?
特别地,Control.Monad.RWS.Lazy.RWS 是一种可交换的单子吗?
一般情况下,如果表达式 a >>= \x -> b >>= \y -> f x y
等同于 b >>= \y -> a >>= \x -> f x y
,那么单子是交换的。
换句话说,如果副作用的顺序不重要,那么单子就是可交换的。我们可以替换表达式:
do a <- ma
b <- mb
f a b
将参数交换的一个函数。
do b <- mb
a <- ma
f a b
大部分许多常见的单子都是可交换的,但您可以通过查看设计并逻辑它或编写一个小程序来测试它以适当的表达式(这自然取决于单子的性质)来确定特定单子是否可交换。据我所知,没有CommutativeMonad类型类。
不,没有CommutativeMonad类。而且RWS不是可交换的。要使一个monad是可交换的,必须能够重新排序效果而不会有任何变化。
Maybe
和Reader
外,你能列举其他的例子吗? - TarraschrunSupply (do {a <- supply; b <- supply; return (a - b)}) [1,2]
→-1
但是runSupply (do {b <- supply; a <- supply; return (a - b)}) [1,2]
→1
。我的推理有错误吗? - dave4420