1

我正在将 Aeson 用于我正在做的一些客户端-服务器工作,将 ADT 编码为 Json。我Data.Aeson.TH用来生成toJSON我需要的实例,但是为 Map 类型生成的实例真的很难看而且很难处理。

我已经定义了我自己的更简单的编码,它只是将它们视为列表:

instance (ToJSON a, ToJSON b) => ToJSON (Map a b) where
  toJSON m = toJSON $ toList m

自然,当我在代码中使用它时,会出现Duplicate instance declarations错误。

有没有办法解决这个问题?我需要告诉 Template Haskell 不要为 Map 生成 ToJson 实例,或者我需要告诉 GHC 忽略该实例并使用我提供的实例。这些都可以吗?

请注意,这不是“重叠实例”问题。我想完全丢弃一个实例,而不是将它与另一个实例混合。

4

1 回答 1

4

要告诉 GHC 忽略库提供的实例并使用您自己的实例,您可以将 Map 包装在一个新类型中:

newtype PrettyMap key val = PrettyMap (Map key val)
instance (ToJSON a, ToJSON b) => ToJSON (PrettyMap a b) where
  toJSON (PrettyMap m) = toJSON $ toList m

另一个解决方案是真正使用OverlappingInstances

data MyData = ...
$(deriveToJSON ... ''MyData)

instance ToJSON (Map Text MyData) where
    toJSON = toJSON . toList
于 2014-02-17T00:50:25.193 回答