我有一个Result<'T, 'E> list
我想Result<'T list, 'E>
按照以下规则变成一个单一的:
- 如果有
Result
,Error
那么结果应该是Error
- 如果结果是 an
Error
它应该是Error
列表中的第一个 - 如果每个结果都是 an
OK
那么结果应该是 anOk
并且应该保持列表顺序
所以我试了一下,实现了如下:
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()
我可以all
在 a 内部使用,result { ... }
但可以进一步集成吗?例如通过实施ResultBuilder.For
?