如何将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
相关产品推荐
相关产品推荐

