我将一些旧代码从Prelude.catch
to更改为Control.Exception.catch
并得到一个模棱两可的类型错误。“没什么大不了的”,我想。但是,经过仔细检查,我不确定为什么这不能按原样工作......
handler :: Exception e => e -> IO x
with_handler :: IO x -> IO x
with_handler act = catch act handler
在我看来,这段代码应该可以工作,但它显然违反了类型系统的一些主格规则。(虽然我不确定是什么。)
有人可以准确解释类型检查器对什么不满意吗?