【发布时间】:2018-03-05 06:42:06
【问题描述】:
当使用Control.Monad.Throw(即exceptions 包)时,让我感到困惑的是,似乎我所有的投掷和接球都必须与SomeException 一起使用。
例如
value :: Either ExitCode String
value = throwM $ ExitFailure 23
在我看来它应该可以编译,因为throwM :: (Exception e, MonadThrow m) => e -> m a 和ExitCode 有一个异常实例。即使这样也无法编译:
value :: Exception e => Either e String
value = throwM $ ExitFailure 23
事实上,它只有在我将签名更改为SomeException 时才会编译。我知道Exception 类型类有一个特殊的地方重新
在documentation for Control.Exception 中,我可以看到他们将catches 与签名ArithException -> m a 或类似的处理程序一起使用的示例。我测试了它,它工作正常。
这在使用exceptions时是不可能的吗?
编辑 错误消息是:
由于使用了
throwM,无法将类型ExitCode与SomeException匹配
或
由于使用了
throwM,无法将类型e与SomeException匹配
【问题讨论】:
-
你得到什么错误信息?
标签: haskell exception-handling