1

所以,已经几个月了,我有点生疏了,但我似乎记得我Either b是一个Monad

Prelude Control.Monad Data.Either> return "Hello" :: Either String String

<interactive>:0:1:                                                       
    No instance for (Monad (Either String))                              
      arising from a use of `return'                                     
    Possible fix:                                                        
      add an instance declaration for (Monad (Either String))            
    In the expression: return "Hello" :: Either String String            
    In an equation for `it':                                             
        it = return "Hello" :: Either String String                      
Prelude> Right "Hi" == return "Hi"                                    

<interactive>:0:15:                                                   
    No instance for (Monad (Either a0))                               
      arising from a use of `return'                                  
    Possible fix: add an instance declaration for (Monad (Either a0)) 
    In the second argument of `(==)', namely `return "Hi"'            
    In the expression: Right "Hi" == return "Hi"                      
    In an equation for `it': it = Right "Hi" == return "Hi"           

所以我可能做错了什么,但我不确定是什么。我正在使用 GHC 7.2.2。

4

2 回答 2

11

从 开始base-4.6.0.0Monad和的Functor实例在Either e中定义Data.Either并自动从Prelude.

以前,在base-4.3.*tobase-4.5*中,实例是在 中定义的,Control.Monad.Instances并且不会自动可用。在此之前,部分与此同时,有一个

instance Error e => Monad (Either e) where
    ...

Control.Monad.Errorofmtl-1.*和 inControl.Monad.Trans.Errortransformers包中定义。这些模块仍然有条件地提供实例(现在没有Error约束),如果它们与base < 4.3.

于 2012-09-13T18:05:38.370 回答
4

导入Control.Monad.Trans.ErrorControl.Monad.Error. Either amonad 实例通常用于错误处理。

> return "Hello" :: (Either String String)
Right "Hello"
于 2012-09-13T17:02:13.073 回答