3

考虑以下测试函数:

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 ()

因为我已经声明了 Either String _ 作为表达式的类型,所以它使用了 MonadError 的 Either String 实现。我假设如果我自己没有指定 MonadError 的实现,或者从另一个函数调用这个函数,允许类型推断,我会得到一个错误。反而:

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

GHCi 似乎提供了某种“默认”错误单子。有人可以解释这里发生了什么吗?

4

1 回答 1

13

在 GHCi 的提示符处键入的表达式会进行两次类型检查:首先包装在 中print,如果由于任何原因失败,则作为 IO 操作。IO在您的情况下,第一次尝试将由于歧义而失败,但第二次尝试使用MonadError.

于 2010-07-13T15:27:01.027 回答