f# - 这种“有结果的有状态函数”模式有名称吗?FSharpPlus 中的抽象?
问题描述
我有一个 type 的功能'state -> 'event -> Result<'state * 'result, 'error>
。我有一个起始'state
和'event list
.
如果所有折叠都正常,或者第一个错误,我想折叠事件并获得最终状态和结果列表。
我可以为它编写一个计算表达式或折叠,但想知道这种模式是否有名称?有什么我可以从 FSharpPlus 开箱即用的东西吗?它似乎接近一个状态单子,但状态和结果都包装在一个Result
类型中,所以它是一种状态+结果单子?
解决方案
正如@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
推荐阅读
- sql-server - 消除 SQL Server 上冗余唯一索引的唯一性是否有好处?
- excel - 在大型工作簿中单独循环遍历每一列
- linux - 计算字数并指定行数
- sorting - 为什么合并打印顺序相反
- r - 来自 geom_abline 的自定义 +/- 10% 波段?
- firebase - Flutter firestore 获取具有地图字段条件的文档
- io - 如何在fortran中直接将4字节数据读入8字节变量?
- c# - C# TcpClient 无法连接到简单的 python TCPIP 侦听器连接被拒绝,即使 docker 实例可以通信
- python - QThread导致整个程序在pyqt5中休眠
- java - 动态访问用户提供的类的用户提供的属性的有效/最佳方法是什么?