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 <daniel.is.fischer@xxxxxx> writes:
>> 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.
Haskell-Cafe mailing list