在我今天编辑它之前,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中积累值.仍然没有意思.
像这样的陈述有时会隐含"忽视底部"的要求,这可能就是其中之一.如果我们忽略底部,这是可交换的.最好明确表达这个要求,因为它可能变得很重要.
如果我们这样做忽视的底部,然后Maybe是可交换的单子也是如此.当然,正如你在问题中提到的那样,从实际上讲,底部是很重要的考虑因素,因此了解它们存在的非交换性是很好的.