gpt4 book ai didi

haskell - 为什么 Data.Bifunctor 的 `first` 不转换这个值

转载 作者:行者123 更新时间:2023-12-04 15:42:31 25 4
gpt4 key购买 nike

在以下内容中:

import Data.Bifunctor
import qualified Data.ByteString.Lazy.UTF8 as BLU

safeReadFile :: FilePath -> ExceptT Text IO Text
safeReadFile p = (lift $ doesFileExist p) >>= bool (throwError "File does not exist") (lift $ pack <$> readFile p)

safeDecodeJSONFile :: FromJSON a => Text -> FilePath -> ExceptT Text IO a
safeDecodeJSONFile t f = do
contents <- safeReadFile f
tryRight $ first (\x -> pack (x ++ (unpack t))) (eitherDecode (BLU.fromString (unpack contents)))

当我运行 runExceptT $ safeDecodeJSONFile "something""nonExistantFile.json" 我希望得到 Left "Does not exist something" 但我只是得到 Left "Does not exist" - 我知道我传递给 first 的函数正在执行,因为没有 pack GHC 提示 的类型>(eitherDecode (BLU.fromString (unpack contents)))ExceptT String IO a 而不是 ExceptT Text IO a - 那么为什么不连接来自 ++ 也会发生吗?

最佳答案

你写了

safeDecodeJSONFile t f = do
contents <- safeReadFile f
tryRight $ ...

ExceptTMonad 实例在它到达 Left 时立即放弃,并准确返回。所以 tryRight ... 永远不会发生。您需要显式处理 Left 情况,也许使用 catchError

虽然我们正在这样做,但仍然存在问题。你写

safeReadFile :: FilePath -> ExceptT Text IO Text
safeReadFile p = (lift $ doesFileExist p) >>= bool (throwError "File does not exist") (lift $ pack <$> readFile p)

不幸的是,这并不可靠。首先,文件不存在只是一个读取失败的原因——可能存在权限错误、网络文件系统的网络问题、如果文件不是常规文件则出现设备错误等。其次,在您检查文件是否存在和您尝试读取它之间,其他人可能会删除该文件。尝试处理文件时通常的建议是不要先检查。只需读取文件并使用 catchControl.Exception 中的类似方法或围绕它们的包装器

捕获任何异常

关于haskell - 为什么 Data.Bifunctor 的 `first` 不转换这个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57325619/

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