我正在使用aeson
包。我有一个在其声明中使用Data.Tree
的数据类型。如下所示,只是更复杂:
data Foo = Foo {
bat :: Text
, xux :: Maybe Text
, tri :: Tree Text
}
我想使用Data.Aeson.TH
为此类型生成FromJSON
个实例。
$(deriveJSON defaultOptions ''Foo)
但是Data.Tree
没有FromJSON
的标准实例,这意味着我需要声明一个孤儿实例。
是否有某种方法可以避免创建该孤立实例,同时仍能使用deriveJSON
?
答案 0 :(得分:4)
为了使实例成为规范(即不是孤儿),需要在类型构造函数(Data.Tree
)或类声明(Data.Aeson.Types
)的同一模块中定义它。因此,定义非孤立实例的唯一方法是fork aeson
(因为aeson
依赖于容器)。
我建议filing a ticket使用aeson
,或者可能是拉取请求,以便将其添加到上游。在此之前,如果您不打算分发代码,定义孤立实例不会造成太大麻烦。如果您正在处理要发布的代码,最安全的解决方案是在Tree
周围创建一个newtype包装器,然后为新类型创建一个FromJSON
实例。