这个 "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
我有一个 '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