榆树中的翻译器模式是什么?

What is the translator pattern in elm?

elm git book 中描述了一种体系结构,其中子组件生成消息,这些消息通过主更新功能传播,最终由子组件中的适当更新功能处理。翻译器模式与此有何不同,每种模式的用例是什么。请提供一个简单的例子。

每当你有一个带有 update 函数的嵌套 "component" 时,你需要确保 parent 通过 child 消息和命令。 git书outlines this with a simple example(这里代码在parent,而Widget是child):

type Msg
  = WidgetMsg Widget.Msg

update message model =
  case message of
    WidgetMsg subMsg ->
      let
        ( updatedWidgetModel, widgetCmd ) =
          Widget.update subMsg model.widgetModel
      in
        ( { model | widgetModel = updatedWidgetModel }, Cmd.map WidgetMsg widgetCmd )

只要 child 具有 update 功能,任何 都需要以上内容。然而,在上面的示例中,parent 永远不知道或不关心什么 child 消息正在传递给 child。

但是现在,考虑 parent 需要了解 child 生成的 Msg 的情况。例如:嵌套的 child 组件需要与游戏失败的 parent 通信的游戏。

当 parent 组件需要对从 child 更新函数返回的消息作出反应时,Translator Pattern 很有用。这是链接示例中更新功能的基本结构:

GameMsg internalMsg -> 
  let
    (game_, cmd) 
       = Game.update internalMsg model.game
  in
    { model | game = game_ } ! [ Cmd.map gameTranslator cmd ]

请注意,它看起来很像前面的 update 示例;主要区别在于,不是将 Cmd 直接映射到盲 parent Msgblind 中的单个 WidgetMsg第一个示例仅传递 child Msg),gameTranslator 映射函数允许您映射到 parent 消息之一。

完整阅读 Translator Pattern Blog Post 可能会有帮助。它是为 Elm 0.17 编写的,因此有一些语法更改,但总体思路仍然成立。