2013-04-22 9 views
6

Vorrei memorizzare valori di Esos usig acid-store. Ho preso una minima implementazione dell'acido e ho cercato di passare in modo ingenuo i tipi a Value. Queste sono le mie chiamate a deriveSafeCopy:Vorrei archiviare il tipo di valore di aeson utilizzando l'acido

$(deriveSafeCopy 0 'base ''Object) 
$(deriveSafeCopy 0 'base ''Array) 
$(deriveSafeCopy 0 'base ''Number) 
$(deriveSafeCopy 0 'base ''Value) 
$(deriveSafeCopy 0 'base ''JSONState) 
$(deriveSafeCopy 0 'base ''JSONStateStore) 

JSONState e JSONStateStore sono i miei tipi. Ottengo questo errore:

Can't derive SafeCopy instance for: (Data.Aeson.Types.Internal.Object,TyConI (TySynD Data.Aeson.Types.Internal.Object [] (AppT (AppT (ConT Data.HashMap.Base.HashMap) (ConT Data.Text.Internal.Text)) (ConT Data.Aeson.Types.Internal.Value)))) 
+0

Grazie - pensi che dovrei rimuovere l'aggiornamento dalla questione? Non sono sicuro dell'etichetta SO. – schellsan

risposta

3

Evidentemente hai raggiunto un limite di ciò che la funzione di Haskell deriveSafeCopy Template può fare per voi.

È possibile risolvere il problema fornendo le istanze manualmente. SafeCopy API contiene documenti completi su come farlo. Per ulteriori esempi è possibile consultare how the default instances are declared.

+0

Grazie Nikita, è quello che mi aspettavo. Penso di aver solo bisogno di sentirlo da qualcuno. Grazie per una spinta nella giusta direzione. – schellsan

+0

Ho aggiunto la mia soluzione sopra. – schellsan

3

Qui è la mia applicazione per coloro che sono ancora interessati:

-- | ACID 

$(deriveSafeCopy 0 'base ''JSONStateStore) 
$(deriveSafeCopy 0 'base ''JSONState) 
$(deriveSafeCopy 0 'base ''Value) 
$(deriveSafeCopy 0 'base ''Number) 

-- | An instance of SafeCopy for the Array Value. 
instance SafeCopy a => SafeCopy (V.Vector a) where 
    getCopy = contain $ fmap V.fromList safeGet 
    putCopy = putCopy . V.toList 

-- | An instance of SafeCopy for the Object Value. 
instance (SafeCopy a, Eq a, Hashable a, SafeCopy b) => SafeCopy (H.HashMap a b) where 
    getCopy = contain $ fmap H.fromList safeGet 
    putCopy = contain . safePut . H.toList 
+0

Le definizioni putCopy non sono corrette e non funzioneranno come previsto. Compileranno comunque, quindi questo è abbastanza pericoloso. Le implementazioni putCopy corrette devono essere (contenere. SafePut. ToList) – Reite

+0

Grazie - aggiornato. – schellsan

Problemi correlati