16

我的印象是某处有一个 Either a 的实例,但我似乎找不到它。我尝试导入 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 ()

但 ghc 告诉我它无法推断(Monad (Either a))。添加

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

使代码编译,但这个实例声明似乎很笼统,如果它不在某些标准模块中,对我来说没有意义。如果是,我应该在哪里找到它,如果不是,那么有什么原因吗?

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

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

4

4 回答 4

18

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

于 2011-02-25T00:57:24.517 回答
6

从基础 4.6 开始,实例本身就是实例Data.Either

于 2015-08-15T07:14:57.957 回答
5

没有 for 的实例Either a,但有 for Either Stringin Control.Monad.Error。(实际上,它是用于Error e => Either e,IIRC)。

于 2011-02-25T00:28:48.810 回答
1

相信里面有东西Control.Monad.Error——不过没有什么要检查的。

于 2011-02-25T00:28:11.670 回答