gpt4 book ai didi

Haskell 中的异常警告,但不是 OldException

转载 作者:行者123 更新时间:2023-12-03 12:56:29 26 4
gpt4 key购买 nike

为什么此代码适用于

import qualified Control.OldException as E

但不是与
import qualified Control.Exception as E

这是代码:
    fileContents <- (readFile "shpm.txt") `E.catch` (\_ -> return "")

这是我在"new"异常中得到的错误
Ambiguous type variable `e0' in the constraint:
(E.Exception e0) arising from a use of `E.catch'
Probable fix: add a type signature that fixes these type variable(s)
In a stmt of a 'do' block:
fileContents <- (readFile "shpm.txt")
`E.catch` (\ _ -> return "No Tasks")

最佳答案

因为品种变了。具体来说:

  • 旧异常:catch :: IO a -> (Exception -> IO a) -> IO a
  • 异常(exception):catch :: Exception e => IO a -> (e -> IO a) -> IO a

  • 新模型需要知道 e 的值是多少适用于 Exception e类型。这实际上意味着您需要告诉编译器您正在捕获哪个异常。你的例子 OldException捕获所有内容,现在不鼓励这样做(有关更多信息,请参阅 Catching All Exceptions)。

    对您的功能的简单修复是这样的:
    foo = (readFile "foo") `E.catch` (\e -> const (return "") (e :: E.IOException))

    或者 lambda-less 版本:
    bar = (readFile "foo") `E.catch` myHandler

    myHandler :: E.IOException -> IO String
    myHandler _ = return ""

    关于Haskell 中的异常警告,但不是 OldException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311787/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com