You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将F#的Result类型列表拆分为对应内部类型的独立列表

你可以通过Array.fold一次遍历完成分类和拆包,直接得到目标类型的两个数组:

通用可复用实现

let partitionResults (results: Result<'Success, 'Error> array) : 'Success array * 'Error array =
    results
    |> Array.fold (fun (okAcc, errAcc) item ->
        match item with
        | Ok value -> (value :: okAcc, errAcc)
        | Error err -> (okAcc, err :: errAcc)
    ) ([], [])
    // 把逆序的列表转回正序的数组
    |> fun (okList, errList) -> (List.rev okList |> Array.ofList, List.rev errList |> Array.ofList)

调用方式

// allData 为你的输入 Result<DataEntry, exn> []
let successEntries, errors = allData |> partitionResults

调用后successEntries就是DataEntry []类型,errors就是exn []类型,不需要额外类型转换。

原代码问题说明

你之前使用的Array.partition仅会根据判断条件把原数组拆分为两个和原元素类型一致的子数组,不会对元素做拆包处理,因此得到的还是Result类型的数组。

可选简化写法

如果你的数组规模不大,不在意两次遍历的性能损耗,也可以用Array.choose写得更简洁:

let successEntries = allData |> Array.choose (function Ok v -> Some v | _ -> None)
let errors = allData |> Array.choose (function Error e -> Some e | _ -> None)

内容的提问来源于stack exchange,提问作者Underscore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:03