
Vo Minh Thu wrote:
Control.Monad.Error provides an instance for Either.
Donn Cave wrote:
... in the mtl transformer library, in case anyone else besides myself didn't know that. And I see it has to be there because it depends on the Error typeclass.
Daniel Fischer
Which is considered a wart by some. (Either left) has a perfectly valid Monad instance for any type left
Indeed, and it is one of the most useful Monads there is. The Either monad provides short-circuiting logic, so that you can exit an arbitrary number of levels of nested calculation. The type Either a b returns a if the calculation exits, or b if it completes without exiting. Exiting on an error condition is one tiny corner case of multi-level exit, so it is a shame that the mtl library defines an orphan instance. By doing that, it hijacks the Either monad and monopolizes it for its own specialized purpose. This is the classic example why defining orphan instances is so dangerous. Now, instead of the natural use of Either for short-circuiting logic, we are forced to find other solutions, such as: o use the MonadPlus instance of Maybe and write everything "additively", using mplus and return instead of (>>=) and Left. That is equivalent to the Either monad, but in practice it ends up looking a lot messier and harder to read. o use a CPS-based monad, like Cont or LogicT. I find those highly obfuscated, and a huge amount of complexity overkill for most tasks. o use a clone of Either, like the Exit monad. That is currently the best workaround, in my opinion. http://www.haskell.org/haskellwiki/New_monads/MonadExit Regards, Yitz