2014-02-17 1 views
1

Я использую Aeson для некоторых файлов клиентского сервера, которые я делаю, кодируя ADT как Json. Я использую Data.Aeson.TH для генерации нужных мне экземпляров toJSON, но экземпляры, сгенерированные для типов карт, действительно уродливы и ужасны.Игнорирование/переопределение экземпляра, сгенерированного с использованием TemplateHaskell

Я определил свою собственную, простую кодировку, которая просто рассматривает их как списки:

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

Естественно, когда я использую это в моем коде, я получаю ошибку Duplicate instance declarations.

Есть ли способ решить эту проблему? Мне нужно либо сообщить Template Haskell НЕ для создания экземпляра ToJson для Map, либо мне нужно сообщить GHC игнорировать этот экземпляр и использовать тот, который я предоставляю. Можно ли это сделать?

Обратите внимание, что это не проблема с перекрывающимися экземплярами. Я хочу полностью выбросить один экземпляр, а не смешивать его с другим.

+0

Это необычно видеть 'toList' вместо' Map.toList'. 'Data.Map' предназначен для импорта. –

+0

сделаю, но это кроме того пункт. – jmite

ответ

4

Рассказывать GHC игнорировать экземпляр библиотеки, предоставляемый и использовать свои собственные вместо этого, вы можете обернуть карту в 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 
+0

Хмм, я попробую обертку типа. Благодаря! – jmite

+0

Как оказалось, я идиот. Я явно получил ToJSON for Map, от которого я тогда избавился, исправляя все. В любом случае, ваш ответ был информативным, поэтому спасибо! – jmite

 Смежные вопросы

  • Нет связанных вопросов^_^