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

时间:2011-02-25 00:21:01

标签: haskell import instance monads 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 ()

但是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 个答案:

答案 0 :(得分:18)

instance已添加到base 4.3.x.xghc 7。同时,您可以直接使用Either实例,或者,如果您使用Either来表示某些内容 可能会失败你应该使用ErrorT monad变换器。

答案 1 :(得分:6)

从基数4.6开始,official demos位于Data.Either本身。

答案 2 :(得分:5)

Either a没有实例,但Either String中有Control.Monad.Error个实例。 (实际上,它适用于Error e => Either e,IIRC)。

答案 3 :(得分:1)

相信 Control.Monad.Error中有什么东西 - 但是没有什么可以检查的。