functional-programming - 同时折叠和映射
问题描述
我有一个功能
f : a -> b -> ( a, c )
我需要申请f
一个列表b
,而a
被累积c
并附加到一个列表中,得到( a, List c )
。我认为我想做的签名是
(a -> b -> ( a, c )) -> a -> List b -> ( a, List c )
这里的真实情况是我有
getThing : Model -> Thing -> ( Model, Cmd Msg )
并且需要getThing
在 的列表上运行Thing
,将 传递Model
给每个调用getThing
并返回模型和Cmd
要在 a 中执行的所有 s Platform.Cmd.batch
。
我认为这个问题应该分解成多个部分,但我不知道从哪里开始。感觉像使用折叠是适合的Model
,但我需要一张地图Cmd
。
解决方案
您只需要解压缩在getThing
折叠的每次迭代中返回的元组,然后使用添加到累积命令列表中的命令作为累加器将其打包。
mapThings : (a -> b -> ( a, c )) -> a -> List b -> ( a, List c )
mapThings getThing initialModel things =
List.foldl
(\thing ( model, cmds ) ->
let
( newModel, cmd ) =
getThing model thing
in
( newModel, cmd :: cmds )
)
( initialModel, [] )
things
这里的命名是非常具体的,以帮助助记符,但只需使用更通用的变量名就可以很容易地概括它。
推荐阅读
- flutter - Flutter 嵌套声明式导航
- wpf - MVVMCross WPF ValueConverter 具有无效转换
- python - 在 C++ 中从 python 调用函数
- c - 我正在学习数据结构并坚持使用 c 中的链表实现队列
- java - 尽管使用了when和thenReturn,但模拟存储库函数会导致空指针异常
- c++ - 我一直试图从编译器那里得到对这两个结果的解释,使用标准中的引号,但到目前为止无济于事
- angular - 错误 TS2304:找不到名称“_ZonePrivate”
- python - 无法使用 Chrome 扩展在 Python Selenium 中找到元素
- r - 冒号运算符的异常行为:在 R 中
- featherlight.js - 段落文本未出现在 Featherlight 灯箱中