等效的二传手,用于匹配 Elm 记录类型的".foo"getter



我需要为我的模型编写很多类型安全的getters和setters(这是一个记录(。getters非常简洁,我对此感到满意。

getFoo = .foo

这非常适合用作内联函数而不给它一个名字:

Maybe.map .foo maybeModel

在所需的最低代码(字段名称(上只有一个额外的字符(.(。不能再获得任何无样板。

但是写等效二传手的最短方法是什么?现在我做到了

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

现在这不再是"毫无意义的",foo周围有很多样板文件,其中大部分是难以键入的特殊字符。

为了澄清起见,有一个关于如何摆脱必须为每个字段编写单独 getter 的相关线程。我对此很好,但我只是希望它对手指和眼睛更轻松。

.foo语法没有等效的简写,而且是一次又一次出现的东西。

如果你想了解更多关于 Evan 省略这样的事情的理由(例如,制作 setter 语法的建议,如!foo或其他特殊符号(,那么邮件列表中就有关于这个话题的长时间讨论。像Elm的许多设计决策一样,我认为答案归结为保持单一的做事方式,并让新手更容易


解决我发现的笨拙的 setter 语法的最简洁方法是为表单的每个值创建一个 setter:

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示例可以这样编写,其中maybeModelmaybeValue从您的示例中交换:

Maybe.map2 setFoo maybeValue maybeModel

当然,你必须创建很多样板 setter 代码,但在我看来,它感觉更自然,看起来比语言提供的 setter 语法好得多。

相关内容

最新更新