2013-04-22 25 views
6

Tôi muốn lưu trữ aeson Giá trị lưu trữ axit usig. Tôi đã thực hiện một axit tối thiểu và cố gắng để chuyển đổi các loại sang Value. Đây là các cuộc gọi của tôi để lấy đượcSafeCopy:Tôi muốn lưu trữ loại Giá trị của aeson bằng cách sử dụng axit

$(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 và JSONStateStore là các loại của riêng tôi. Tôi gặp lỗi này:

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

Cảm ơn - Bạn nghĩ tôi nên loại bỏ các bản cập nhật từ các câu hỏi? Tôi không chắc về SO nghi thức. – schellsan

Trả lời

3

Rõ ràng bạn đã đạt đến giới hạn của chức năng deriveSafeCopy Mẫu Haskell có thể làm cho bạn.

Bạn có thể giải quyết vấn đề bằng cách cung cấp các phiên bản thủ công. SafeCopy API chứa tài liệu toàn diện về cách thực hiện điều đó. Để biết thêm ví dụ, bạn có thể xem how the default instances are declared.

+0

Cảm ơn bạn Nikita, đó là những gì tôi mong đợi. Tôi nghĩ tôi chỉ cần nghe nó từ một người nào đó. Cảm ơn bạn đã đẩy đúng hướng. – schellsan

+0

Tôi đã thêm giải pháp của mình ở trên. – schellsan

3

Đây là thực hiện của tôi đối với những người vẫn còn quan tâm:

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

Các định nghĩa putCopy không chính xác và sẽ không hoạt động như mong đợi. Họ sẽ biên dịch tuy nhiên, điều này khá nguy hiểm. Việc triển khai putCopy chính xác phải là (chứa. SafePut. ToList) – Reite

+0

Cảm ơn - đã cập nhật. – schellsan

Các vấn đề liên quan