Take the 2-minute tour ×

I was under the impression that there was an instance for Either a somewhere, but I can't seem to find it. I have tried importing Control.Monad, Control.Monad.Instances and Data.Either as shown

module Main where

import Control.Monad
import Data.Either
import Control.Monad.Instances

test :: [Either a b] -> Either a [b]
test = sequence

main = return ()

but ghc tells me that it could not deduce (Monad (Either a)). Adding

instance Monad (Either a) where
    return = Right
    Right b >>= f = f b
    Left a >>= _ = Left a

makes the code compile, but this instance declaration seems so general that it doesn't make sense to me if it isn't already out there in some standard module. If it is, where should I look to find it, and if it isn't, is there then a reason for this?

share|improve this question
The reason for the stupid error constraint is to make fail work "properly." Yet another reason why the fail method is a failure. –  sclv Feb 25 '11 at 0:53
@sclv: I'm not sure I follow. The reason I was looking for was why there was no standard (Either a) monad instance declaration. –  Boris Feb 25 '11 at 1:50
add comment

3 Answers

up vote 14 down vote accepted

This instance has been added in base 4.3.x.x, which comes with ghc 7. Meanwhile, you can use the Either instance directly, or, if you are using Either to represent something that may fail you should use ErrorT monad transformer.

share|improve this answer
In the meantime Control.Monad.Trans.Error in transformers provides an identical instance for backwards compatibility if used with an older version of base, so if you import that you can work across versions. –  Edward Kmett Mar 1 '11 at 2:02
add comment

There is not an instance for Either a, but there is for Either String in Control.Monad.Error. (Actually, it's for Error e => Either e, IIRC).

share|improve this answer
add comment

I believe there's something in Control.Monad.Error - don't have anything to check, though.

share|improve this answer
add comment

Your Answer


