- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在以下内容中:
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 $ ...
ExceptT
的 Monad
实例在它到达 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)
不幸的是,这并不可靠。首先,文件不存在只是一个读取失败的原因——可能存在权限错误、网络文件系统的网络问题、如果文件不是常规文件则出现设备错误等。其次,在您检查文件是否存在和您尝试读取它之间,其他人可能会删除该文件。尝试处理文件时通常的建议是不要先检查。只需读取文件并使用 catch
或 Control.Exception
中的类似方法或围绕它们的包装器
关于haskell - 为什么 Data.Bifunctor 的 `first` 不转换这个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57325619/
我正在通过阅读本书来了解 Haskell Haskell Programming from First Principles, Allen & Moronuki . 在 Monad Transform
这个问题在这里已经有了答案: Overlapping instances in Haskell when I'd expect it not to overlap due to constraints
使用 Bifunctor 时,我们可以访问 first 和 second “map” 函数。所以基本上它是一个仿函数,允许我们以两种不同的方式进行 fmap。 Monoid 有类似的东西吗?一些概念允
rank2classes包提供了 Functor 的版本映射函数似乎是类型构造函数之间的自然转换。 按照这个想法,这里是 Bifunctor 的 2 级版本: {-# LANGUAGE RankNTy
Control.Lens.Iso 包含许多很棒的函数,用于将 Iso 提升为有用抽象的各种类型参数。例如: 映射 任意Functor contramapping Contravariant 仿函数 d
在以下内容中: import Data.Bifunctor import qualified Data.ByteString.Lazy.UTF8 as BLU safeReadFile :: File
如果我有一个 Bifunctor[A,A] 的实例bf,一个函数 f : A => A和一个 Boolean值(value) p : def calc[A, F[_,_]: Bifunctor](p:
我是一名优秀的程序员,十分优秀!