1

我将一些旧代码从Prelude.catchto更改为Control.Exception.catch并得到一个模棱两可的类型错误。“没什么大不了的”,我想。但是,经过仔细检查,我不确定为什么这不能按原样工作......

handler :: Exception e => e -> IO x

with_handler :: IO x -> IO x
with_handler act = catch act handler

在我看来,这段代码应该可以工作,但它显然违反了类型系统的一些主格规则。(虽然我不确定是什么。)

有人可以准确解释类型检查器对什么不满意吗?

4

1 回答 1

3

编译器不知道为handler. 它在运行时看不到引发了什么异常,然后为 选择适当的类型handler,它必须在编译时解析类型。

可能可以给出handler类型

handler :: SomeException -> IO x

这将解决歧义。

于 2013-01-20T16:58:16.593 回答