Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何确定单子是否是可交换的?_Haskell_Monads_Commutativity - Fatal编程技术网

Haskell 如何确定单子是否是可交换的?

Haskell 如何确定单子是否是可交换的?,haskell,monads,commutativity,Haskell,Monads,Commutativity,的文档声明它“除非参数monad是可交换的,否则不会产生monad。” 如何确定单子是否是可交换的?有一个可交换的monad类型类吗?应该有吗 特别是,是交换单子吗 不,没有交换单子类。RWS是不可交换的。如果一个单子是可交换的,你必须能够在没有任何变化的情况下重新排列效果。一般来说,如果表达式a>=\x->b>=\y->fxy相当于b>=\y->a>=\x->fxy,那么单子是可交换的 换句话说,如果副作用的顺序不重要,它是可交换的。我们可以替换以下表达式: do a <- ma

的文档声明它“除非参数monad是可交换的,否则不会产生monad。”

  • 如何确定单子是否是可交换的?有一个可交换的monad类型类吗?应该有吗

  • 特别是,是交换单子吗


  • 不,没有交换单子类。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