Is there no standard (Either a) monad instance?

2019-02-08 08:45发布

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?

-------------- EDIT ---------------

Be aware that I now think that the answer by user31708 below ("As of base 4.6, the instance is in Data.Either itself.") is currently the correct answer. I am not sure of the proper protocol of reassigning the selected answer in this case, where the selected answer was the correct answer at the time that the question was asked, so I have left it as it is. Please correct me, if there is another guideline for this.

4条回答
仙女界的扛把子
2楼-- · 2019-02-08 09:00

As of base 4.6, the instance is in Data.Either itself.

查看更多
放我归山
3楼-- · 2019-02-08 09:01

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).

查看更多
别忘想泡老子
4楼-- · 2019-02-08 09:05

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.

查看更多
劳资没心,怎么记你
5楼-- · 2019-02-08 09:13

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

查看更多
登录 后发表回答