同时折叠和映射

问题描述 投票:0回答:1

我有功能

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部分需要贴图。

functional-programming elm
1个回答
0
投票

[您只需要在折叠的每次迭代中解压缩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

这里的命名是特定于帮助助记符的,但是可以通过使用更通用的变量名来轻松地将其概括。

© www.soinside.com 2019 - 2024. All rights reserved.