同时折叠和映射

Rup*_*ord 2 functional-programming elm

我有一个功能

f : a -> b -> ( a, c )
Run Code Online (Sandbox Code Playgroud)

并且我需要申请, whilef的列表累积并附加到列表中,获取. 我想我想做的签名是bac( a, List c )

(a -> b -> ( a, c )) -> a -> List b -> ( a, List c )
Run Code Online (Sandbox Code Playgroud)

这里的真实情况是我有

getThing : Model -> Thing -> ( Model, Cmd Msg )
Run Code Online (Sandbox Code Playgroud)

并且需要getThing在 的列表上运行Thing,将 传递Model给每个调用getThing并返回模型和所有Cmd要在Platform.Cmd.batch.

我认为这个问题应该分解成多个部分,但我不确定从哪里开始。感觉使用折叠适合Model,但我需要Cmd零件的地图。

gle*_*nsl 5

您只需要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
Run Code Online (Sandbox Code Playgroud)

此处的命名非常有助于助记符,但只需使用更通用的变量名称即可轻松推广。