Ответ 1
Для того, чтобы экземпляр был каноническим (то есть не сиротой), он должен быть определен в том же модуле, что и конструктор типа (Data.Tree
) или объявление класса (Data.Aeson.Types
). Таким образом, единственным способом определить экземпляр без сироты будет fork aeson
(поскольку aeson
зависит от контейнеров).
Я бы рекомендовал подачу билета с помощью aeson
или, возможно, запроса на перенос, чтобы добавить его вверх по течению. До тех пор, если вы не планируете распространять код, определение экземпляра-сироты не должно вызывать особых проблем. Если вы работаете над кодом, который хотите опубликовать, самым безопасным решением является создание обертки newtype вокруг Tree
, затем создайте экземпляр FromJSON
для нового типа.