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

Haskell 是否没有标准(或a)monad实例?,haskell,import,instance,monads,either,Haskell,Import,Instance,Monads,Either,我的印象是,某个地方有一个例子,但我似乎找不到。我已尝试导入Control.Monad、Control.Monad.Instances和数据。如图所示 module Main where import Control.Monad import Data.Either import Control.Monad.Instances test :: [Either a b] -> Either a [b] test = sequence main = return () 但ghc告诉我,

我的印象是,某个地方有一个例子,但我似乎找不到。我已尝试导入Control.Monad、Control.Monad.Instances和数据。如图所示

module Main where

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

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

main = return ()
但ghc告诉我,它无法推断(单子(或a))。添加

使代码可以编译,但是这个实例声明看起来太一般了,如果它还没有出现在一些标准模块中,那么对我来说就没有意义了。如果是的话,我应该在哪里找到它,如果不是的话,有什么原因吗

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


请注意,我现在认为下面由user31708给出的答案(“从Base4.6开始,实例在数据中,或者实例本身”)是当前正确的答案。我不确定在这种情况下重新分配所选答案的正确方案,所选答案在提出问题时是正确的答案,因此我将其保留原样。如果有其他的指导方针,请纠正我。

我相信
控件中有一些东西。Monad.Error
-但是没有任何东西需要检查。

没有
或a
的实例,但是
控件.Monad.Error
中有for
或String
。(实际上,它是针对
错误e=>或e
,IIRC)。

这已添加到
base 4.3.x.x
中,它随
ghc 7
一起提供。同时,您可以直接使用
实例,或者,如果您使用
实例,则可以使用
实例来表示某事

这可能会失败,您应该使用monad transformer

从base 4.6开始,位于
数据中。
本身。

愚蠢错误约束的原因是使
失败
正常工作。
失败
方法失败的另一个原因。@sclv:我不确定我是否遵循了。我寻找的原因是为什么没有标准的(或a)monad实例声明。同时,transformers中的Control.monad.Trans.Error提供了一个相同的实例,以便在与旧版本的base一起使用时向后兼容,因此,如果导入该实例,则可以跨版本工作。
instance Monad (Either a) where
    return = Right
    Right b >>= f = f b
    Left a >>= _ = Left a