问题描述:

Until I edited it today, the Haskell Wiki claimed that Maybe is a commutative monad (actually, I think it still claims it somewhere). This is clearly wrong, because

do {a <- Nothing; b <- undefined; return (a,b)} === Nothing

while

do {b <- undefined; a <- Nothing; return (a,b)} === undefined

This failure of commutativity is actually rather important in real code: programmers rely on the fact that the computation will stop as soon as it reaches Nothing.

This leaves (among the monads described as commutative on the Haskell Wiki) only the Reader monad, which doesn't seem to do anything terribly exciting. That raised the question in my mind about whether there are any commutative monads in Haskell that are substantially different from Reader, aside from restrictions of Reader.

Edit

I just realized it's also possible to make a restricted Writer monad be commutative—it needs to accumulate values in some commutative monoid. Still not interesting.

网友答案:

Statements like that sometimes have an implied "ignoring bottoms" requirement and this is probably one of those cases. It's commutative if we ignore bottoms. It's better to explicitly express that requirement though, because it can become important.

If we do ignore bottoms, then Maybe is a commutative Monad as well. Of course, as you mentioned in the question, bottoms are important to consider practically speaking, so it is good to be aware of the non-commutativity in their presence.

网友答案:

The set monad qualifies as commutative and, IMO, interesting.

相关阅读:
Top