考虑以下测试函数:
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 似乎提供了某种“默认”错误单子。有人可以解释这里发生了什么吗?