12

我正在使用该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

4

1 回答 1

4

为了使实例是规范的(即不是孤立的),它需要在与类型构造函数(Data.Tree)或类声明(Data.Aeson.Types)相同的模块中定义。因此,定义非孤立实例的唯一方法是分叉aeson(因为aeson取决于容器)。

我建议使用提交票证aeson或者可能是拉取请求,以将其添加到上游。在那之前,如果您不打算分发代码,那么定义一个孤立实例应该不会造成太大的麻烦。如果您正在处理要发布的代码,最安全的解决方案是创建一个 newtype 包装器Tree,然后FromJSON为 newtype 创建一个实例。

于 2013-10-12T19:04:50.200 回答