在 Haskell 中消除 Aeson 中的 .= 运算符的歧义

Disambiguate the .= operator in Aeson in Haskell

我在将对象序列化为 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.(.=)

这是一个猜测,但似乎是错误的语法。我通过类比将parens添加到以下资源:

这给了我这个错误:

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

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

正确的语法是什么,"let .= be unambiguously the .= from Data.Aeson"?

如果您同意将文件中的 .= 定义为来自 Aeson 的文件,您可以简单地隐藏 Control.Lens 中的 .= 的导入:

import Control.Lens hiding ((.=))

外括号是导入隐藏列表,内括号是必需的,因为 .= 是一个运算符 - 也就是说,名称中包含非字母数字字符。

答案可以通过更仔细地阅读错误输出以查看两个句点并用括号作为运算符包围(整个事物)来找到。这有效

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