2013-04-22 16 views
6

我想存儲aeson值usig acid-store。我已經採取了最低限度的酸實施,並試圖天真地將類型切換到價值。這些是我派生的安全拷貝:我想用酸存儲aeson's Value類型

$(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和JSONStateStore是我自己的類型。我得到這個錯誤:

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

謝謝 - 你覺得我應該從問題刪除更新?我不確定禮儀。 – schellsan 2013-04-24 23:16:12

回答

3

顯然你已經達到了什麼樣的deriveSafeCopy模板Haskell的功能,可以爲你做一個限制。

您可以通過手動提供實例來解決問題。 SafeCopy API包含有關如何做到這一點的綜合文檔。有關其他示例,您可以查看how the default instances are declared

+0

謝謝Nikita,這就是我的預期。我想我只是需要從某人那裏聽到它。感謝您的正確方向。 – schellsan 2013-04-23 01:30:48

+0

我在上面添加了我的解決方案。 – schellsan 2013-04-24 22:44:41

3

這裏是我的實現爲那些誰還有興趣:

-- | 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

putCopy定義不正確,無法按預期工作。他們會編譯,所以這是相當危險的。正確的putCopy應該是(包含。safePut。toList) – Reite 2014-02-27 11:02:34

+0

謝謝 - 更新。 – schellsan 2014-03-04 06:50:08