dav*_*420 18 monads haskell commutativity
Control.Monad.List.ListT的文档声明它"除非参数monad是可交换的,否则不会产生monad".
我怎样才能知道monad是否可交换?是否存在CommutativeMonad类型类?应该有吗?
特别是,Control.Monad.RWS.Lazy.RWS是一个可交换的monad?
Jer*_*Kun 12
一般来说,如果表达式a >>= \x -> b >>= \y -> f x y相当于monad,则monad是可交换的b >>= \y -> a >>= \x -> f x y.
换句话说,如果副作用的顺序不重要,则它是可交换的.我们可以替换表达式:
do a <- ma
b <- mb
f a b
Run Code Online (Sandbox Code Playgroud)
用一个切换参数.
do b <- mb
a <- ma
f a b
Run Code Online (Sandbox Code Playgroud)
大多数常见的monad都是可交换的,但你可以通过查看设计和记录它来确定一个特定的monad是否可交换,或者通过编写一个小程序来用适当的表达式来测试它(这自然取决于monad的性质) .据我所知,没有CommutativeMonad类型类.