2010-07-13 78 views
3

請看下面的測試功能:什麼是GHCi MonadError的默認實現?

testError :: (Error e, MonadError e m) => Bool -> m() 
testError True = return() 
testError False = throwError $ strMsg "hello world" 

在GHCI提示,我可以做到以下幾點:

*Main> testError False :: Either String() 
Left "hello world" 
*Main> testError True :: Either String() 
Right() 

因爲我說不是String _作爲表達的類型,它使用的不是String MonadError的實現。我假設如果我沒有自己指定MonadError的實現,或者從另一個函數調用該函數,並允許類型推斷,我會得到一個錯誤。相反:

*Main> testError True 
*Main> testError False 
*** Exception: user error (hello world) 

這似乎是GHCi提供某種「默認」錯誤monad。有人能解釋這裏發生了什麼嗎?

回答

13

在GHCi的提示符處輸入的表達式會被檢查兩次:首先包裝在print中,如果因任何原因失敗,則作爲IO操作。在你的情況下,第一次嘗試會因模糊而失敗,但第二次嘗試使用MonadErrorIO實例進行類型檢查。

相關問題