Есть ли название для этого шаблона «функция с отслеживанием состояния с результатом»? Абстракция для этого в 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
Другие вопросы по тегам