我怎样才能知道monad是否可交换?

dav*_*420 18 monads haskell commutativity

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

  1. 我怎样才能知道monad是否可交换?是否存在CommutativeMonad类型类?应该有吗?

  2. 特别是,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类型类.

  • 我会说相反,大多数monad不是可交换的,除了"Maybe"和"Reader"之外,你能说出任何一个例子吗? (6认同)
  • @Tarrasch:[来自ICFP 2009的这次演讲](http://vimeo.com/6590617)有一些很好的可交换单子的例子. (3认同)

aug*_*tss 5

不,没有CommutativeMonad类.RWS不是可交换的.对于monad是可交换的,你必须能够重新排序效果而不需要任何改变.