代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

消除歧义哈斯克尔埃森的接线员

  •  0
  • Mittenchops  · 技术社区  · 6 年前

    我试图在将对象序列化为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”的正确语法是什么 .= 明确地成为 .= 从…起 Data.Aeson " ?

    2 回复  |  直到 6 年前
        1
  •  7
  •   Koterpillar    6 年前

    如果你同意定义 .= 在Aeson提供的文件中,只需隐藏 .= 从…起 Control.Lens :

    import Control.Lens hiding ((.=))
    

    外括号是导入隐藏列表,内括号是由于 .= 作为一名操作员——也就是说,拥有一个非字母数字字符的名称。

        2
  •  2
  •   Mittenchops    6 年前

    答案可以通过更仔细地阅读错误输出,看到两个周期,并以帕伦斯作为运算符围绕(整个事件)来找到。这很管用

    (.=) = (Data.Aeson..=)
    
    推荐文章