【发布时间】:2019-04-17 01:39:26
【问题描述】:
我在将对象序列化为 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.(.=)
这是一个猜测,但似乎是错误的语法。我通过类比将括号添加到以下资源:
- https://hackage.haskell.org/package/aeson-0.6.1.0/docs/src/Data-Aeson-Types-Class.html#.%3D
- http://www.stephendiehl.com/posts/protolude.html
- https://stackoverflow.com/a/18372384/1052117
这给了我这个错误:
(.=) = Data.Aeson (.=)
<interactive>:1:8: error:
Not in scope: data constructor ‘Data.Aeson’
No module named ‘Data’ is imported.
正确的语法是什么,“让 .= 明确地成为来自 Data.Aeson 的 .=”?
【问题讨论】: