6

acid-store を使用して aeson Values を保存したいと思います。私は最小限の酸の実装を取り、単純に型を値に切り替えようとしました。これらは、deriveSafeCopy への私の呼び出しです。

$(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))))
4

2 に答える 2

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
于 2013-04-24T23:15:06.953 に答える
3

deriveSafeCopyTemplate Haskell 関数でできることの限界に達したようです。

インスタンスを手動で提供することで、問題を解決できます。SafeCopy APIには、その方法に関する包括的なドキュメントが含まれています。追加の例については、デフォルトのインスタンスがどのように宣言されているかを確認できます。

于 2013-04-23T01:06:53.857 に答える