Haskell 如何确定单子是否是可交换的?
的文档声明它“除非参数monad是可交换的,否则不会产生monad。”Haskell 如何确定单子是否是可交换的?,haskell,monads,commutativity,Haskell,Monads,Commutativity,的文档声明它“除非参数monad是可交换的,否则不会产生monad。” 如何确定单子是否是可交换的?有一个可交换的monad类型类吗?应该有吗 特别是,是交换单子吗 不,没有交换单子类。RWS是不可交换的。如果一个单子是可交换的,你必须能够在没有任何变化的情况下重新排列效果。一般来说,如果表达式a>=\x->b>=\y->fxy相当于b>=\y->a>=\x->fxy,那么单子是可交换的 换句话说,如果副作用的顺序不重要,它是可交换的。我们可以替换以下表达式: do a <- ma
不,没有交换单子类。RWS是不可交换的。如果一个单子是可交换的,你必须能够在没有任何变化的情况下重新排列效果。一般来说,如果表达式
a>=\x->b>=\y->fxy
相当于b>=\y->a>=\x->fxy
,那么单子是可交换的
换句话说,如果副作用的顺序不重要,它是可交换的。我们可以替换以下表达式:
do a <- ma
b <- mb
f a b
做一个我想说的相反,大多数monad是不可交换的,除了也许
和阅读器
之外,你能举出其他例子吗?我经常使用MonadSupply和Random,当然也有一些无序数据结构的实现,比如multiset。但这是一个公平的批评。根据您的定义,MonadSupply似乎不是可交换的<代码>runSupply(do{a@Tarrasch:有一些很酷的交换单子的例子。我以前见过。这是一个很棒的讲座。
do b <- mb
a <- ma
f a b