1

私は、ADTをJsonとしてエンコードして、クライアント/サーバーの一部にAesonを使用しています。私は必要なインスタンスをData.Aeson.TH生成するために使用していますが、Map タイプ用に生成されたインスタンスは本当に醜く、扱いがひどいものです。toJSON

それらをリストとして扱うだけの、独自のより単純なエンコーディングを定義しました。

instance (ToJSON a, ToJSON b) => ToJSON (Map a b) where
  toJSON m = toJSON $ toList m

当然、コードでこれを使用すると、Duplicate instance declarationsエラーが発生します。

これを解決する方法はありますか?Template Haskell に Map の ToJson インスタンスを生成しないように指示するか、GHC にそのインスタンスを無視して私が提供したインスタンスを使用するように指示する必要があります。これらのいずれかを実行できますか?

これは「重複インスタンス」の問題ではないことに注意してください。あるインスタンスを別のインスタンスと混ぜずに完全に捨てたいです。

4

1 に答える 1

4

ライブラリ提供のインスタンスを無視し、代わりに独自のインスタンスを使用するよう GHC に指示するには、Map を newtype でラップします。

newtype PrettyMap key val = PrettyMap (Map key val)
instance (ToJSON a, ToJSON b) => ToJSON (PrettyMap a b) where
  toJSON (PrettyMap m) = toJSON $ toList m

別の解決策は、実際に使用することOverlappingInstancesです:

data MyData = ...
$(deriveToJSON ... ''MyData)

instance ToJSON (Map Text MyData) where
    toJSON = toJSON . toList
于 2014-02-17T00:50:25.193 に答える