Есть ли название для этого шаблона «функция с отслеживанием состояния с результатом»? Абстракция для этого в FSharpPlus?
У меня есть функция типа
'state -> 'event -> Result<'state * 'result, 'error>
. У меня есть начало
'state
а также
'event list
.
Я хотел бы свернуть события и получить окончательное состояние и список результатов, если все сгибы были в порядке, или первая ошибка.
Я мог бы написать вычислительное выражение или свернуть для него, но мне было интересно, есть ли имя для этого шаблона? Есть ли что-то, что я мог бы использовать прямо из коробки от FSharpPlus? Это похоже на монаду состояний, но состояние и результат заключены в
Result
типа, так это вроде состояние + монада результата?
1 ответ
Как уже указывал @carsten, у вас есть
StateT
доступно на F#+
У тебя есть:
'state -> 'event -> Result<'state * 'result, 'error>
Теперь давайте поменяем местами некоторые параметры:
'event -> 'state -> Result<'result * 'state, 'error>
это можно выразить как
StateT<'state, Result<'result * 'state, 'error>
в текущей кодировке F#+ StateT.
Итак, давайте назовем вашу функцию
f
и давайте представим, что у вас есть
events
который является
list<'event>
(или вообще любую другую проходимую структуру событий), теперь вы можете сделать это:
#r "nuget: FSharpPlus, 1.2"
open FSharpPlus
open FSharpPlus.Data
// your code for 'f', 'events' and `initialState` definition goes here
let foldedStateT : StateT<'state, Result<'result * 'state, 'error> =
events |> traverse (fun x -> StateT (f x))
let finalResult = StateT.run foldedStateT initialState