Эквивалентный сеттер, соответствующий методу `.foo` для типа записи Elm - PullRequest
0 голосов
/ 05 октября 2018

Мне нужно написать много типов безопасных геттеров и сеттеров для моей модели (что является рекордом).Получатели очень лаконичны, и я доволен этим.

getFoo = .foo

Это идеально для использования в качестве встроенной функции без указания имени:

Maybe.map .foo maybeModel

Только один дополнительный символ(.) сверх минимально необходимого кода (имя поля).Не может быть больше без шаблонов.

Но какой самый короткий способ написать эквивалентный установщик?Теперь я делаю

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

Теперь это больше не "бессмысленно", и вокруг foo есть множество шаблонов, большинство из которых трудно вводить специальными символами.

Для пояснения есть связанный поток о том, как избавиться от необходимости писать отдельный метод получения для каждого поля.Я в порядке с этим, но я просто хочу, чтобы это было проще для пальцев и глаз.

1 Ответ

0 голосов
/ 05 октября 2018

Нет эквивалентного сокращения синтаксиса .foo, и это то, что возникает снова и снова.

В списке рассылки идут долгие дискуссии на протяжении многих лет, если вы хотите узнать больше о причинах, по которым Эван упускает такую ​​вещь (например, предложения по созданию синтаксиса сеттера, например !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

Конечно, вам нужно создать много стандартного установочного кода, но, на мой взгляд, работать с ним гораздо естественнее и выглядит намного лучше, чемсинтаксис сеттера, который обеспечивает язык.

...