首页 > 解决方案 > 这种“有结果的有状态函数”模式有名称吗?FSharpPlus 中的抽象?

问题描述

我有一个 type 的功能'state -> 'event -> Result<'state * 'result, 'error>。我有一个起始'state'event list.

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

我可以为它编写一个计算表达式或折叠,但想知道这种模式是否有名称?有什么我可以从 FSharpPlus 开箱即用的东西吗?它似乎接近一个状态单子,但状态和结果都包装在一个Result类型中,所以它是一种状态+结果单子?

标签: f#f#+

解决方案


正如@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

推荐阅读