gpt4 book ai didi

f# - 如何在 F# 中组合 Result<> 列表?

转载 作者:行者123 更新时间:2023-12-02 16:17:36 25 4
gpt4 key购买 nike

使用此代码:

let a = [3; 4; 5; 6; 7]
let check x = if x % 2 = 0 then Ok x else Error x
let b = a |> List.map check

我怎样才能将 B 概括为:

  • 如果一切都好,那就好
  • 如果有错误,则错误

我可以创建一个方法来执行此操作,但我不禁想到必须内置它,或者必须有一个聪明的简单方法来实现它(顺便说一句,我有 FsToolkit.ErrorHandling,以防万一它是内置的。

最佳答案

实际上您可以自己编写函数,一旦您意识到要转换 Result<'a,'b> 的列表。成单Result<'a list,'b list> .

module Result =
let ofList arg =
(arg, Ok[]) ||> List.foldBack (fun t s ->
match t, s with
| Ok x, Ok xs -> Ok(x::xs) // all Ok so far, prepend to state
| Error e, Ok _ -> Error[e] // first Error, discard accumulated state
| Ok _, Error es -> Error es // ignore every Ok after first Error
| Error e, Error es -> Error(e::es) ) // second or later Error, prepend to state
// val ofList : arg:Result<'a,'b> list -> Result<'a list,'b list>

[3; 4; 5; 6; 7]
|> List.map (fun x -> if x % 2 = 0 then Ok x else Error x)
|> Result.ofList
// val it : Result<int list,int list> = Error [3; 5; 7]

关于f# - 如何在 F# 中组合 Result<> 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66247826/

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