代码之家  ›  专栏  ›  技术社区  ›  Thilo

与Elm记录类型的`.foo` getter匹配的等效setter

  •  3
  • Thilo  · 技术社区  · 6 年前

    getFoo = .foo
    

    Maybe.map .foo maybeModel
    

    只有一个额外的字符( . )在最低要求的代码(字段名)上。再也没有免费的样板了。

    Maybe.map2 (\x v -> {x | foo = v} ) maybeModel maybeValue
    

    foo ,大多数情况下很难输入特殊字符。

    为了澄清,有一个 related thread 关于如何避免为每个字段编写单独的getter。我很好,但我只是想让手指和眼睛更容易。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Thilo    6 年前

    没有与之相当的速记 .foo 语法和它的东西,出现了一次又一次。

    如果你想了解更多关于埃文省略这类东西的理由(例如,使setter语法像 !foo 或其他特殊符号)。就像Elm的许多设计决策一样,我认为答案可以归结为保持一种单一的做事方式,让新来者保持轻松。


    setFoo : Foo -> Model -> Model
    setFoo foo model = { model | foo = foo }
    

    自从 model

    updateModel : Foo -> Bar -> Model -> Model
    updateModel foo bar model =
        model
            |> setFoo foo
            |> setBar bar
    

    或者如果你想更简洁一点,你可以用 >> 缩短上述时间:

    updateModel2 : Foo -> Bar -> Model -> Model
    updateModel2 foo bar = setFoo foo >> setBar bar
    

    Maybe.map2 例子可以这样写,其中 maybeModel maybeValue 从您的示例中替换:

    Maybe.map2 setFoo maybeValue maybeModel
    

    当然,您必须创建大量样板setter代码,但在我看来,使用这种语言感觉更自然,而且看起来比该语言提供的setter语法要好得多。