2013-10-12 16 views
10

私はaesonパッケージを使用しています。私はその宣言にData.Treeを使用するデータ型を持っています。 、次のようなだけで、より複雑な:DataTreeの孤児のFromJSONインスタンスの作成を避ける方法

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

私はこのタイプのFromJSONインスタンスを生成するためにData.Aeson.THを使用したいです。

$(deriveJSON defaultOptions ''Foo) 

しかしData.Treeは、私は孤児instaceを宣言する必要があることを意味し、FromJSONするための標準的なインスタンスを持っていません。

孤児のインスタンスを作成しないようにする方法はありますか?まだderiveJSONを使用できますか?

+1

これはライブラリ内で使用されるのでしょうか、またはあなたが書いているアプリケーション用ですか?それがアプリケーションの場合、孤立したインスタンスには何も問題はありません。 –

+0

@Gabriel Gonzalezこれは図書館で使用されます。 – danidiaz

答えて

4

インスタンスが正準(孤立ではない)になるためには、型コンストラクタ(Data.Tree)またはクラス宣言(Data.Aeson.Types)と同じモジュールで定義する必要があります。したがって、孤立していないインスタンスを定義する唯一の方法は、aesonをforkすることです(aesonはコンテナに依存するため)。

アップストリームに追加するには、filing a ticketaesonとするか、場合によってはプルリクエストをおすすめします。それまでは、コードを配布する予定がない場合、孤立したインスタンスを定義しても大した問題はありません。パブリッシュするコードで作業している場合、最も安全な解決策は、Treeのまわりにnewtypeラッパーを作成し、次にnewtypeのFromJSONインスタンスを作成することです。

関連する問題