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

与Elm记录类型的“.foo”getter匹配的等效setter,elm,pointfree,Elm,Pointfree,我需要为我的模型(这是一个记录)编写很多类型安全的getter和setter。getter非常简洁,我对此很满意 getFoo = .foo 这非常适合作为内联函数使用,无需命名: Maybe.map .foo maybeModel 在所需的最小代码(字段名)上仅多出一个字符()。不能再免费得到更多的样板文件了 但是,编写等效setter的最短方法是什么?现在我知道了 Maybe.map2 (\x v -> {x | foo = v} ) maybeModel maybeValue

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

getFoo = .foo
这非常适合作为内联函数使用,无需命名:

Maybe.map .foo maybeModel
在所需的最小代码(字段名)上仅多出一个字符(
)。不能再免费得到更多的样板文件了

但是,编写等效setter的最短方法是什么?现在我知道了

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

Maybe.map2 setFoo maybeValue maybeModel

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

切换参数以允许组合这些setter是很好的,然而,
.foo
语法并没有相应的缩写,它是一次又一次出现的东西。如果您想了解更多关于Evan省略此类内容的原因(例如,建议使用setter语法,如
!foo
或其他特殊符号),那么多年前的邮件列表上就有关于该主题的长期讨论。像Elm的许多设计决策一样,我认为答案可以归结为保持单一的做事方式,并让新来者更容易。