У меня есть Result<'T, 'E> list
, который я хотел бы превратить в сингл Result<'T list, 'E>
, следуя этим правилам:
- Если какой-либо
Result
являетсяError
, тогда результат должен бытьError
- Если результат -
Error
, он должен быть первымError
в списке. - Если каждый результат -
OK
, тогда результат должен бытьOk
и порядок в списке должен быть сохранен.
Итак, я решил реализовать это следующим образом:
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
внутри result { ... }
, но возможна ли дальнейшая интеграция? Например, реализовав ResultBuilder.For
?
sequence
и работает для любого Traversable. - person Gus   schedule 13.06.2018