Unfortunately, the instance of Monad for Either a is somewhat misguided in Haskell.
There is a spurious restraint that the Left value in your Either be a member of some Error class, which was brought about by the deletion of MonadZero from Haskell 98 (as part of the elimination of failure free patterns, and an attempted simplification of the language).
In order to support the arguable misfeature of including 'fail' in Monad, the Either instance for Monad has this extra constraint.
That in and of itself is only mildly annoying, but then to use that constraint requires a multi-parameter type class for MonadError, which isn't a Haskell 98 feature. So it isn't in the standard prelude, which tries to limit itself to that which could be plausibly implemented as Haskell 98, but instead sits off in one of the dozen or so monad transformer library variants floating around.
In theory, this is good, because you can then define your own monad instance for Either without that constraint -- if you don't care to exploit the Error instance's ability to get fail to work. Or you want a real Either monad for tricks like Oleg's recent post on the constructive law of excluded middle, or to talk about apomorphisms as a generalized anamorphism, parameterized on the either monad so it can be symmetrical to paramorphisms. In practice, you link in someone's code that links in the MTL, and then you're stuck using the MTL instance anyways.
-Edward Kmett
On Thu, Sep 10, 2009 at 9:03 PM, Evan Laforge
<qdunkan@gmail.com> wrote:
Is there any particular reason to not move the instance to the
prelude? A module was failing when imported from one place and ok
when imported from another, so I spent a frustrating 10 minutes
searching for the instance. I couldn't find a way to search haddock
for instances (not even grep on the html), nor hoogle, nor anything
else. Finally I turned to google and found a couple of haskell-cafe
threads with people wondering why other people's code failed for them.
This was especially frustrating because I knew I had written my own
instance when I originally couldn't find it, then removed my own when
I did find it, then forgot where I found it *two times* so I knew it
existed, just not where. So this is the third time I've done this
search. Now I have a few commented 'import Control.Monad.Error ()'
scattered about in a few "low level" modules to try to make sure it's
visible everywhere and next time I go hunting I can look in my own
modules.
If orphan instances are discouraged, shouldn't the instance for Monad
Either be declared where Either is? This should probably go for
Functor Either too. I notice that Monad Maybe is in Prelude, and it
would be a pain if it weren't.
If there's no particular reason to not move it, I'll do a libraries
proposal... or since it involves the prelude should this be
haskell-prime?
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe