Я хотел бы сохранить тип значения aeson, используя кислоту

Я хотел бы сохранить значения aeson, используя acid-store. Я взял минимальную кислотную реализацию и попытался наивно переключить типы на Value. Это мои вызовы для производныхSafeCopy:

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

person schellsan    schedule 22.04.2013    source источник
comment
Спасибо - как вы думаете, я должен удалить обновление из вопроса? Я не уверен в этикете SO.   -  person schellsan    schedule 25.04.2013


Ответы (2)


Очевидно, вы достигли предела того, что функция deriveSafeCopy Template Haskell может сделать для вас.

Вы можете решить эту проблему, предоставив экземпляры вручную. SafeCopy API содержит подробные документы о том, как это сделать. Для получения дополнительных примеров вы можете проверить как объявляются экземпляры по умолчанию .

person Nikita Volkov    schedule 23.04.2013
comment
Спасибо, Никита, я этого и ожидал. Думаю, мне просто нужно было услышать это от кого-нибудь. Спасибо за толчок в правильном направлении. - person schellsan; 23.04.2013
comment
Я добавил свое решение выше. - person schellsan; 25.04.2013

Вот моя реализация для тех, кому все еще интересно:

-- | 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
person schellsan    schedule 24.04.2013
comment
Определения putCopy неверны и не будут работать должным образом. Однако они будут компилироваться, так что это довольно опасно. Правильные реализации putCopy должны быть (содержат .safePut .toList) - person Reite; 27.02.2014