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。有人能解釋這裏發生了什麼嗎?