2013-10-12 2 views
10

Ich verwende das aeson-Paket. Ich habe einen Datentyp, der Data.Tree in seiner Deklaration verwendet. Wie die folgenden, nur komplexer:So vermeiden Sie das Erstellen einer verwaisten FromJSON-Instanz für Data.Tree

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

Ich möchte Data.Aeson.TH verwenden, um eine FromJSON Beispiel für diese Art zu erzeugen.

$(deriveJSON defaultOptions ''Foo) 

Aber Data.Tree hat keine Standard-Instanz für FromJSON, was bedeutet, dass ich brauchen würde eine Waise instace zu erklären.

Gibt es eine Möglichkeit zu vermeiden, diese verwaiste Instanz zu erstellen und trotzdem deriveJSON zu verwenden?

+1

Wird dies in einer Bibliothek verwendet oder ist es für eine Anwendung, die Sie schreiben? Wenn es sich um eine Anwendung handelt, ist an einer verwaisten Instanz nichts falsch. –

+0

@Gabriel Gonzalez Es wird in einer Bibliothek verwendet werden. – danidiaz

Antwort

4

Damit eine Instanz kanonisch sein kann (d. H. Nicht verwaist), muss sie im selben Modul wie der Typkonstruktor (Data.Tree) oder die Klassendeklaration (Data.Aeson.Types) definiert sein. Die einzige Möglichkeit, eine nicht-verwaiste Instanz zu definieren, wäre also Fork aeson (da aeson von Containern abhängig ist).

Ich würde empfehlen filing a ticket mit aeson, oder möglicherweise eine Pull-Anforderung, um es stromaufwärts hinzugefügt werden. Solange Sie den Code nicht verteilen möchten, sollte die Definition einer verwaisten Instanz keine großen Probleme bereiten. Wenn Sie an Code arbeiten, den Sie veröffentlichen möchten, ist die sicherste Lösung, einen neuen Wrapper um Tree zu erstellen und dann eine FromJSON Instanz für den newtype zu erstellen.

Verwandte Themen