haskell - GHCi 对 MonadError 的默认实现是什么?

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

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

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

GHCi 似乎提供了某种“默认”错误单子(monad)。有人可以解释一下这是怎么回事吗?

最佳答案

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

关于haskell - GHCi 对 MonadError 的默认实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3238286/

相关文章:

angular - 如何正确处理和控制Angular和Web API中的错误-2

haskell - cabal install --- 全局约束需要安装实例

c++ - 是否可以访问 Haskell 中的底层 Window 类型?

java - 如何在 OOP 中为 API 或框架设计一个健壮的 Status 类?

haskell - 产生不同解释器结果的等效函数

haskell - 使用颜色设置 ghci 提示

haskell - 简洁地优先考虑ghci中的非Prelude函数

haskell - 为什么嵌套在其他 monad 中的 IO 不会执行?有没有办法强制他们?

haskell - 具有 "real"返回函数的 monad

go - 将返回错误分配给下划线