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"           

だから私はおそらく何か間違ったことをしているのですが、何が起こっているのかわかりません。GHC7.2.2を使用しています。

4

2 に答える 2

11

の時点でbase-4.6.0.0MonadのとFunctorインスタンスEither eはで定義されてData.Eitherおり、から自動的に利用できますPrelude

以前は、でbase-4.3.*base-4.5*インスタンスはで定義されてControl.Monad.Instancesおり、自動的に使用可能ではありませんでした。その前に、そして部分的にそれと同時に、

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

Control.Monad.Errormtl-1.*、およびパッケージControl.Monad.Trans.Errorからので定義されます。これらのモジュールは、。とともに使用された場合でも、条件付きでtransformersインスタンスを提供します(現在は制約なし) 。Errorbase < 4.3

于 2012-09-13T18:05:38.370 に答える
4

インポートControl.Monad.Trans.ErrorまたはControl.Monad.ErrorEither aモナドインスタンスは通常、エラー処理で使用されます。

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