haskell Aeson对象无存储示例

9nvpjoqh  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(124)

下面的代码为store生成孤立示例。它在aeson 1.4.7.1中运行良好,但在aeson 2.0.3.0中生成错误。

{-# LANGUAGE DeriveDataTypeable,DeriveGeneric,TemplateHaskell,GeneralizedNewtypeDeriving,        OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

import           Data.Store      (Store)
import           TH.Derive
import           Data.Scientific
import           Data.Aeson (Value)

-- This will allow us to serialize Aeson objects
$($(derive [d| instance Deriving (Store (Scientific)) |]))
$($(derive [d| instance Deriving (Store (Value)) |])) -- Template haskell derivation of Store    instance for Value

使用aeson 2.0.3.0(如堆栈LTS-20.13中所列-工作代码是使用LTS-16.31store 0.7.1aeson 1.4.7.1一起编译的),它现在会抛出关于aeson内部对象缺少某些存储示例的错误-顶级错误如下:

No instance for (Store
                         aeson-2.0.3.0:Data.Aeson.Types.Internal.Object)
        arising from a use of ‘store-0.7.16:Data.Store.Impl.size’

会很感激关于如何解决这个问题的建议。

更新

根据@daniel-wagner的建议添加了以下模板haskell派生(以及要编译的ScopedTypeVariable杂注):

$($(derive [d| instance Deriving (Store (Key)) |])) 
$($(derive [d|
    instance Store a => Deriving (Store (KeyMap a))
    |]))
rdlzhqv9

rdlzhqv91#

看起来像Object(它实际上不是一个内部数据结构;它也是从Data.Aeson.Types导出的,没有.Internal)已经从HashMap的类型别名(有一个Store示例)变成了抽象数据结构(没有示例)。您需要为KeyKeyMap类型编写Store示例,然后就可以开始了。例如,使用toListfromList实现KeyMap的程序员成本低廉的实现:

instance Store v => Store (KeyMap v) where
    size = contramap toList size
    poke = contramap toList poke
    peek = fmap fromList peek

类似地,toTextfromText对应于Key

instance Store Key where
    size = contramap toText size
    poke = contramap toText poke
    peek = fmap fromText peek

如果您正在编写一个库,您可能希望将这些示例推到它们自己的包中,这样就可以在Hackage上轻松地发现它们--比如,将其命名为store-aeson或其他名称--以减少孤立示例的痛苦。(我梦想有一天有一个可搜索的孤儿示例注册中心......总有一天,在我丰富的空闲时间......)

相关问题