我将一些旧代码从Prelude.catch
更改为Control.Exception.catch
,并且出现了模糊的类型错误。 “没什么大不了的”,我想。然而,经过仔细检查,我不确定为什么这不起作用......
handler :: Exception e => e -> IO x
with_handler :: IO x -> IO x
with_handler act = catch act handler
在我看来,这段代码应该工作,但它显然违反了类型系统的一些主格规则。 (虽然我不确定。)
有人可以准确解释类型检查器不满意的内容吗?
答案 0 :(得分:3)
编译器不知道handler
使用哪种类型。它无法在运行时看到引发的异常,然后为handler
选择适当的类型,它必须在编译时解析类型。
可能会给handler
类型
handler :: SomeException -> IO x
这将解决歧义。