是否没有标准(A a a)monad实例?

Bor*_*ris 16 import monads haskell instance either

我的印象是,某个地方有一个实例,但我似乎无法找到它.我已经尝试导入Control.Monad,Control.Monad.Instances和Data.Either,如图所示

module Main where

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

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

main = return ()
Run Code Online (Sandbox Code Playgroud)

但ghc告诉我它无法演绎(Monad(Either a)).添加

instance Monad (Either a) where
    return = Right
    Right b >>= f = f b
    Left a >>= _ = Left a
Run Code Online (Sandbox Code Playgroud)

使代码编译,但是这个实例声明似乎很普遍,如果它在某些标准模块中还没有出现,那对我来说没有意义.如果是的话,我应该在哪里找到它,如果不是,那么有没有理由呢?

--------------编辑---------------

请注意,我现在认为下面的user31708的答案("从4.6开始,实例在Data.Either本身.")是目前正确的答案.我不确定在这种情况下重新分配所选答案的正确协议,其中所选答案是在提出问题时的正确答案,所以我保持原样.如果还有其他指导方针,请纠正我.

Alv*_*ivi 18

实例已添加base 4.3.x.x,随附ghc 7.同时,您可以Either直接使用该实例,或者,如果您Either用于表示可能失败的内容,则应使用ErrorTmonad转换器.

  • 同时,如果与旧版本的base一起使用,变换器中的Control.Monad.Trans.Error为向后兼容性提供了相同的实例,因此如果您导入它,则可以跨版本工作. (3认同)

use*_*708 6

从基础4.6开始,实例就在其中Data.Either.


wno*_*ise 5

没有一个实例Either a,但对于Either StringControl.Monad.Error.(实际上,它适用于Error e => Either eIIRC).