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

标签 f#

使用此代码:

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/

相关文章:

f# - 运算符优先级和关联

F# 返回类型强制

function - F# 将(自定义)类型分配给函数

C# 和 F# 转换 - 特别是 'as' 关键字

f# - 如何计算字符串中特定字符的出现次数

optimization - F# 和 ILNumerics

f# - 将每 2 个元素映射到一个函数/构造函数

docker - Ubuntu Docker 镜像具有最少的单声道运行时间,以便运行 F# 应用程序

com - 在 F# 中嵌入互操作类型

visual-studio - 为什么我在 VS 2017 中没有 F# 语法颜色的设置?