直到我今天编辑它,Haskell Wiki claimed Maybe
是一个可交换的monad(实际上,我认为它仍然在某个地方声称它)。这显然是错误的,因为
do {a <- Nothing; b <- undefined; return (a,b)} === Nothing
,而
do {b <- undefined; a <- Nothing; return (a,b)} === undefined
这种交换失败在实际代码中实际上相当重要:程序员依赖于计算一到达Nothing
就会停止的事实。
这(在被称为Haskell Wiki上可交换的monad中)只剩下Reader
monad,它似乎没有做任何令人兴奋的事情。除了 <{em> Reader
的限制之外,我在脑海中提出了一个问题,即Haskell中是否存在与Reader
大不相同的可交换monad。
我刚刚意识到它也可能使受限制的Writer
monad成为可交换的 - 它需要在一些可交换的monoid中积累值。仍然没有意思。
答案 0 :(得分:6)
这样的陈述有时会暗示&#34;忽略底部&#34;要求,这可能是一个 那些案件。如果我们忽略底部,它是可交换的。但是,明确表达这一要求会更好,因为它可能变得很重要。
如果我们做忽略底部,那么Maybe
也是一个可交换的Monad。当然,正如你在问题中所提到的那样,从实际上讲,底部是很重要的,所以要了解它们存在的非交换性是很好的。
答案 1 :(得分:3)
set monad有资格作为交换,IMO很有意思。