gpt4 book ai didi

f# - 将结果列表转换为计算表达式中列表的结果?

转载 作者:行者123 更新时间:2023-12-04 18:01:13 29 4
gpt4 key购买 nike

我有一个 Result<'T, 'E> list我想变成单例Result<'T list, 'E>遵循这些规则:

  • 如果有 ResultError那么结果应该是 Error
  • 如果结果是 Error应该是第一个 Error在列表中
  • 如果每个结果都是 OK那么结果应该是 Ok并且应该保持列表顺序

  • 所以我尝试了如下实现:
    let all xs = 
    let folder = fun state next ->
    match (state, next) with
    | (Result.Ok ys, Result.Ok y) -> ys |> List.append [ y ] |> Result.Ok
    | (Result.Error e, _) -> Result.Error e
    | (_, Result.Error e) -> Result.Error e
    Seq.fold folder (Result.Ok []) xs

    然而,这似乎已经在标准库中实现了。有吗?

    其次,我有一个 Result 的计算表达式像这样:
    type ResultBuilder () = 
    member this.Bind(x, f) =
    match x with
    | Result.Ok o -> f o
    | Result.Error e -> Result.Error e
    member this.Return(value) = Result.Ok value
    member this.ReturnFrom(value) = value

    let result = new ResultBuilder()

    我可以用 all内部 result { ... }但是否有可能进一步整合?例如通过实现 ResultBuilder.For ?

    最佳答案

    您有一个 Result<'a, 'e> list并想要一个 Result<'a list, 'e> .这听起来像 sequence https://fsharpforfunandprofit.com/posts/elevated-world-4/ 中描述的功能(尽管名称听起来像,但与 seq 无关)。快速检查 https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/result.fs表明该函数尚未在标准 FSharp.Core 库中实现,因此您需要自己实现它。

    顺便说一句,如果您还没有读过 Scott Wlaschin 的“Elevated World”系列,我不建议从我链接的文章中间开始。从 this article 开始相反,当它构建背景知识时,您需要了解“遍历”和“序列”函数的作用。然后您将了解实现这些功能之一的一般模式。

    至于你的第二个问题,能否再具体说明一些?例如,您希望 ResultBuilder.For 有什么行为? ? for 预期的正常行为表达式将采用 Result<'a, 'e> list (或 seq 或数组)并为每个 Result<'a, 'e> 运行一次内部块这是在列表或序列或数组中。如果您尝试使用您的 all函数在这里,你会在 Result<'a, 'e> 之间有类型不匹配(这是 F# 期望 CE 的 .For 方法产生的)和 Result<'a list, 'e>这是您的 all方法正在返回。您具体想要什么ResultBuilder.For方法呢?

    关于f# - 将结果列表转换为计算表达式中列表的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50789065/

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