这个 "stateful function with result" 模式有名称吗? FSharpPlus 中对它的抽象?

Is there a name for for this "stateful function with result" pattern? An abstraction for it in FSharpPlus?

我有一个 'state -> 'event -> Result<'state * 'result, 'error> 类型的函数。我有一个起始 'state'event list.

我想折叠事件并获得最终状态和结果列表,如果所有折叠都正常,或者第一个错误。

我可以写一个计算表达式或折叠它,但想知道是否有这种模式的名称? FSharpPlus 有什么我可以开箱即用的东西吗?它看起来接近状态 monad,但是状态和结果都包含在 Result 类型中,所以它有点像状态 + 结果 monad?

正如@carsten 已经指出的那样,您可以在 F#+

中使用 StateT

你有:

'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