在Haskell有任何有趣的交换单子吗?

dfe*_*uer 4 monads haskell

在我今天编辑它之前,Haskell Wiki 声称这Maybe是一个可交换的monad(实际上,我认为它仍然在某个地方声称它).这显然是错误的,因为

do {a <- Nothing; b <- undefined; return (a,b)} === Nothing
Run Code Online (Sandbox Code Playgroud)

而

do {b <- undefined; a <- Nothing; return (a,b)} === undefined
Run Code Online (Sandbox Code Playgroud)

这种交换失败在实际代码中实际上相当重要:程序员依赖于计算一到达就会停止的事实Nothing.

这留下(在Haskell Wiki上被描述为可交换的Readermonad中)只有monad,它似乎没有做任何非常令人兴奋的事情.这引发了是否有哈斯克尔任何交换单子是基本上不同于在我脑海里的问题Reader,除了限制的 Reader.

编辑

我只是意识到也可以使受限制的Writermonad成为可交换的 - 它需要在一些可交换的monoid中积累值.仍然没有意思.

Dav*_*vid 6

像这样的陈述有时会隐含"忽视底部"的要求,这可能就是其中之一.如果我们忽略底部,这是可交换的.最好明确表达这个要求,因为它可能变得很重要.

如果我们这样做忽视的底部,然后Maybe是可交换的单子也是如此.当然,正如你在问题中提到的那样,从实际上讲,底部是很重要的考虑因素,因此了解它们存在的非交换性是很好的.

  • 我认为,任何关于Haskell的分类陈述(即关于Haskell中的类别理论的陈述)都隐含地忽略了底部,这是非常公平的. (5认同)
  • @dfeuer为了证明一个平等法甚至适用于底层,你不仅要证明你所要证明的法律,你还必须证明一切都在同一时间的两个方面同时进行评估.通常是一种痛苦,它排除了一些有用的法律.此外,如果一个平等保持正常而不是底部,我可能会更担心哪种方式对于长计算更有效,而不是担心底部的行为. (2认同)