gpt4 book ai didi

function - 在 Elm 中使用 Dict.update 和嵌套更新函数

转载 作者:行者123 更新时间:2023-12-02 04:03:02 25 4
gpt4 key购买 nike

我正在编写一个 Elm 应用程序,其中状态的主要部分位于 Dict 中,以 Record 作为值。我有一个用于主状态模型的更新函数,以及一个用于 Dict 中各个记录的更新函数。有没有办法将 Dict.update 与记录状态更新功能一起使用?

我遇到的问题是记录的状态更新函数返回更新函数通常返回的内容:包含更新对象和要触发的任何命令的元组(例如(newRecord, Cmd.none))。但是 Dict.update 函数需要接收一条记录并返回一条记录(例如,newRecord),而不是包含记录和命令对象的元组。

有办法解决这个问题吗?现在我已经使用 Dict.getDict.insert 的组合来工作,但这看起来很笨拙。

最佳答案

如果记录的更新函数总是返回Cmd.none,您可以简化它,只返回更新后的模型。

如果您的应用程序架构不需要,子模块不必遵循( Model, Cmd Msg ) 约定。

如果您确实需要从较低级别传递命令,也可以重新构造子模块的 update 函数来简化这些更新。

基于 example/http 的示例

下面是一个示例,说明如何拆分更新,以便您可以在顶级更新中重复使用相同的逻辑,而无需额外的技巧。

update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
(updateModel msg model, updateCmd msg model)


updateCmd: Msg -> Model -> Cmd Msg
updateCmd msg model =
case msg of
MorePlease ->
getRandomGif model.topic

_ ->
Cmd.none


updateModel: Msg -> Model -> Model
updateModel msg model =
case msg of
NewGif (Ok newUrl) ->
Model model.topic newUrl

_ ->
model

如果您需要在 updateCmd 中更新模型,则只需传递它而不是当前模型,或者如果需要,甚至可以同时传递两者。

作为奖励,您可以完全省略 case 表达式的未使用分支。

使用Dict.update

还可以在 Dict.update 中使用 updateModel,而无需检索记录并将其写回。

Dict.update childKey (Maybe.map (updateModel childMsg)) model

关于function - 在 Elm 中使用 Dict.update 和嵌套更新函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40981781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com