2012-09-13 48 views
1

所以,它已經幾個月,我有點生疏,但我似乎記得Either b是一個Monad爲什麼不能GHCI找到無論是單子實例b

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

導入Control.Monad.Trans.ErrorControl.Monad.ErrorEither a monad實例通常用於錯誤處理。

> return "Hello" :: (Either String String) 
Right "Hello" 
+0

這也解決了我的問題。謝謝 :) –

11

作爲base-4.6.0.0,對於Either eMonadFunctor和實例在Data.Either定義和自動可從Prelude

此前,在base-4.3.*base-4.5*之間,實例在Control.Monad.Instances中定義,並且不自動可用。在此之前,並同時與它的一部分,有一個

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

mtl-1.*Control.Monad.Error的界定,Control.Monad.Trans.Errortransformers包。如果它們與base < 4.3一起使用,這些模塊仍然有條件地提供實例(現在沒有Error約束條件)。

相關問題