什么是GHCi的MonadError默认实现?

时间:2010-07-13 14:42:02

标签: haskell error-handling ghci

考虑以下测试功能:

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

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

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

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

1 个答案:

答案 0 :(得分:13)

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