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)