Exception 如何在Haskell中重新显示泛型异常
给定Exception 如何在Haskell中重新显示泛型异常,exception,haskell,Exception,Haskell,给定 f::Int->IO(某些异常Int) g=do 结果只需使用throwIO$head errs 错误消息是因为fromException需要转到编译时已知的类型。您没有为它提供上下文来确定它是什么类型,因此它抱怨类型变量不明确 幸运的是,你不需要知道它是什么类型的SomeException也是Exception的一个实例。它可以在不知道它包含什么类型的情况下重新调用。事实上,如果你看一下Exception类的定义,它只是toException和fromException,这是依靠Type
f::Int->IO(某些异常Int)
g=do
结果只需使用throwIO$head errs
错误消息是因为fromException
需要转到编译时已知的类型。您没有为它提供上下文来确定它是什么类型,因此它抱怨类型变量不明确
幸运的是,你不需要知道它是什么类型的SomeException
也是Exception
的一个实例。它可以在不知道它包含什么类型的情况下重新调用。事实上,如果你看一下Exception
类的定义,它只是toException
和fromException
,这是依靠Typeable
来确保它们不会破坏类型系统的转换函数SomeException
的Exception
实例的定义可能是最无聊的。但是现在我在捕获异常时遇到了一个模糊的错误:tryJust(Just.toException)a
抱怨toException
的e
没有被修复。。但是它应该适用于所有e
s,不是吗?哦,它只是将e
修复为SomeException
。。这是非直觉的:)
f :: Int -> IO (Either SomeException Int)
g = do
results <- mapM f [1,2,3]
let (errs, succs) = partitionEithers results
if null errs then return succs
else -- rethrow arbitrary exception
throwIO (fromJust . fromException $ head errs)