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

Mit*_*ops 1 haskell aeson

我正在尝试将对象序列化为json时重命名键。

我知道这样做的方法是,而不是仅使用派生泛型,而是使用如下自定义键名定义实例:

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

但是,这给了我:

<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’)
Run Code Online (Sandbox Code Playgroud)

我试图解决此问题的方法是.=通过在我的代码中定义操作符来显式强制其含义,例如:

(.=) = Data.Aeson.(.=)
Run Code Online (Sandbox Code Playgroud)

这是一个猜测,但似乎语法错误。我将类推类推添加到以下资源中:

这给了我这个错误:

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

<interactive>:1:8: error:
    Not in scope: data constructor ‘Data.Aeson’
    No module named ‘Data’ is imported.
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法说,“让我们.=明确地对.=来自Data.Aeson”?

Kot*_*lar 7

如果可以.=在文件中将其定义为Aeson的文件,则可以简单地隐藏.=from 的导入Control.Lens

import Control.Lens hiding ((.=))
Run Code Online (Sandbox Code Playgroud)

外部括号是导入隐藏列表,内部括号.=是操作员所必需的-即,名称带有非字母数字字符。