Как избежать создания сиротского экземпляра FromJSON для Data.Tree

Я использую пакет aeson. У меня есть тип данных, который использует Data.Tree в своем объявлении. Как и ниже, только сложнее:

 data Foo = Foo {
               bat :: Text 
             , xux :: Maybe Text 
             , tri :: Tree Text
            }

Я хочу использовать Data.Aeson.TH для создания экземпляра FromJSON для этого типа.

$(deriveJSON defaultOptions ''Foo)

Но Data.Tree не имеет стандартного экземпляра для FromJSON, что означает, что мне нужно будет объявить сиротский instace.

Есть ли способ избежать создания этого сиротского экземпляра, хотя он все еще может использовать deriveJSON?

Ответ 1

Для того, чтобы экземпляр был каноническим (то есть не сиротой), он должен быть определен в том же модуле, что и конструктор типа (Data.Tree) или объявление класса (Data.Aeson.Types). Таким образом, единственным способом определить экземпляр без сироты будет fork aeson (поскольку aeson зависит от контейнеров).

Я бы рекомендовал подачу билета с помощью aeson или, возможно, запроса на перенос, чтобы добавить его вверх по течению. До тех пор, если вы не планируете распространять код, определение экземпляра-сироты не должно вызывать особых проблем. Если вы работаете над кодом, который хотите опубликовать, самым безопасным решением является создание обертки newtype вокруг Tree, затем создайте экземпляр FromJSON для нового типа.