我有一个>列表,我希望按照以下规则将其转换为单个>:
- 如果任何一个是,则结果应为
- 如果结果是,则它应该是列表中的第一个
- 如果每个结果都是,则结果应为,并且应保持列表顺序
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()
我可以在result { ... }
中使用all
,但是否可以进行更进一步的集成呢?例如通过实现ResultBuilder.For
?
sequence
,可适用于任何可遍历对象。 - Gus