openlang

Можно явно разрешить неоднозначность обновления записи?

у меня есть минимальный пример в Haskell Playground, можно ли как-нибудь заставить этот код компилироваться? не понимаю, как объяснить GHC, что обновлять нужно тип A. поиск в основном находит руководство пользователя GHC и вот этот вопрос на stackoverflow https://stackoverflow.com/questions/47854019/disambiguate-record-update-with-duplicaterecordfields

Переведено с английскогоПоказать оригинал

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    С RecordWildCards один из вариантов — case recordA of MkA {..} -> MkA {c = 17, ..}, хотя мне это тоже кажется неудовлетворительным.

    Было бы здорово писать просто MkA {c = 17, ..recordA}, чтобы перенести все поля из recordA в новую запись.

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Или так

    main = do
        print $ let MkA {..} = recordA in MkA {c = 17, ..}

    Стоит упомянуть, что, несмотря на уродливый синтаксис, здесь явно видно выделение совершенно новых данных вместо изменения существующих на месте. Поэтому я бы предпочёл обозначение примерно такого вида

    MkA { c = 17
        , .. = recordA
        }
    Переведено с английскогоПоказать оригинал
  3. Ссылка на ответ

    Можно добавить к recordA ещё одну аннотацию типа, например заменить эту строку на print $ (recordA :: A) {c = 17}. Появится предупреждение, которое можно спокойно отключить с помощью {-# OPTIONS_GHC -Wno-ambiguous-fields #-}. А со временем добавление {-# LANGUAGE OverloadedRecordUpdate #-} позволит снова убрать эту аннотацию.

    Да, вся эта ситуация ужасна. (https://discourse.haskell.org/t/what-are-you-supposed-to-do-about-wambiguous-fields/9545/22)

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. Как унаследовать класс внутри другого класса?

    Здравствуйте, В пакете, код которого я не могу менять, есть такая иерархия классов: Я хочу добавить удобную обёртку вокруг In…

    Ответы 1Последняя активность scala
  2. Сравнение привязок have и let в Lean4

    Я заметил, что эти два выражения и ведут себя одинаково. То же происходит при доказательстве теорем. Они взаимозаменяемы? В ч…

    Ответы 3Последняя активность lean-4
  3. Инициализация TypeScript Map со значениями в виде массивов строк

    Создаю Map, в котором каждая запись содержит массив строк. Как одновременно задать его тип и инициализировать одним выражение…

    Ответы 2Последняя активность typescript