gpt4 book ai didi

error-handling - "Merging"F# 中的歧视联合?

转载 作者:行者123 更新时间:2023-12-01 10:19:59 24 4
gpt4 key购买 nike

this question 开始,我在将不同类型的 Result 类型组合在一起时遇到问题。

(下面是一个人为的例子,不是真正的代码)

假设我有一个读取文件的函数:

type ReadFileError = 
| FileNotFound of string

let readFile (path : string) : Result<string, ReadFileError> =
// --- 8< ---

还有一个以某种方式解析它的函数:

type JsonParseError = 
| InvalidStructure of string

let parseJson (content : string) : Result<Json, JsonParseError> =
// --- 8< ---

现在我可以将这些结合起来创建一个读取和解析文件的函数:

type ReadJsonError = 
| ReadFileError of ReadFileError
| JsonParseError of JsonParseError

let readJson (path : string) : Result<Json, ReadJsonError> =
match path |> readFile with
| Ok content ->
match content |> parseJson with
| Ok json -> Ok json
| Error e -> Error (ReadJsonError.JsonParseError e)
| Error e -> Error (ReadJsonError.ReadFileError e)

如您所见,统一错误类型相当尴尬。我需要定义一个新的联合类型并正确包装 Error 端。对于基于异常的方法,这不是您必须担心的事情,因为 throw 在类型方面是开放式的。

在组合不同类型的错误时,是否可以使 Result 样式方便?

最佳答案

组合错误类型是 Result 的问题我只有在尝试时才意识到这一点。

对于异常,这是通过让所有异常都继承一个基类来“解决”的。因此,一种类似的方法可能是 type R<'T> = Result<'T, exn>

但是,我发现这没有吸引力,而且通常会陷入一种模式,即我定义自己的结果类型,允许同类类型的聚合失败。

有点像

type BadResult = Message of string | Exception of exn
type BadTree = Leaf of BadResult | Fork of BadTree*BadTree
type R<'T> = Good of 'T | Bad of BadTree

另一种方法可能是结合 Result使用 Choice 失败.不确定最终会不会因此进入一个特别吸引人的地方。

let bind (t : Result<'T, 'TE>) (uf  'T -> Result<'U, 'UE>) : Result<'U, Choice<'TE, 'TU>> = ...

这可能对您一点帮助都没有,但也许它会产生一些关于如何进行的想法?

关于error-handling - "Merging"F# 中的歧视联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53536450/

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