Устранить неоднозначность оператора. = В Aeson в Haskell - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь переименовать ключи при сериализации объекта в json.

Я понимаю, что способ сделать это состоит в том, чтобы вместо того, чтобы просто использовать обобщение, определить экземпляр с именами пользовательских ключей, например так:

-- instance ToJSON R2  -- old
instance ToJSON R2 where
  toJSON (R2 recCode recDate) = object [ "code" .= recCode , "date" .= recDate ]
-- new

Однако это дает мне:

<interactive>:2:70: error:
    Ambiguous occurrence ‘.=’
    It could refer to either ‘Data.Aeson..=’, imported from ‘Data.Aeson’ (and originally defined in ‘aeson-1.3.1.1:Data.Aeson.Types.ToJSON’)
                          or ‘Control.Lens..=’, imported from ‘Control.Lens’ (and originally defined in ‘Control.Lens.Setter’)

Моя попытка исправить это состояла в том, чтобы явно форсировать значение оператора .=, определив его в моем коде, например:

(.=) = Data.Aeson.(.=)

Это было предположение, но, похоже, неправильный синтаксис.Я добавил парены по аналогии со следующими ресурсами:

Это дало мне эту ошибку:

(.=) = Data.Aeson (.=)

<interactive>:1:8: error:
    Not in scope: data constructor ‘Data.Aeson’
    No module named ‘Data’ is imported.

Какой правильный синтаксис говорит: «Пусть .= однозначно будет .= из Data.Aeson»?

Ответы [ 2 ]

7 голосов
/ 17 апреля 2019

Если вы согласны с определением .= в вашем файле как файла Aeson, вы можете просто скрыть импорт .= из Control.Lens:

import Control.Lens hiding ((.=))

Внешние скобки - это список скрытия импорта, внутренние скобки требуются из-за того, что .= является оператором, то есть имеет имя с не алфавитно-цифровыми символами.

2 голосов
/ 17 апреля 2019

Ответ можно найти, прочитав вывод ошибки более внимательно, чтобы увидеть два периода, и окружив (целое) паренами в качестве оператора. Это работает

(.=) = (Data.Aeson..=)
...