我有功能
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
中执行的所有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
这里的命名是特定于帮助助记符的,但是可以通过使用更通用的变量名来轻松地将其概括。