下面的代码为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.31
与store 0.7.1
和aeson 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))
|]))
1条答案
按热度按时间rdlzhqv91#
看起来像
Object
(它实际上不是一个内部数据结构;它也是从Data.Aeson.Types
导出的,没有.Internal
)已经从HashMap
的类型别名(有一个Store
示例)变成了抽象数据结构(没有示例)。您需要为Key
和KeyMap
类型编写Store
示例,然后就可以开始了。例如,使用toList
和fromList
实现KeyMap
的程序员成本低廉的实现:类似地,
toText
和fromText
对应于Key
:如果您正在编写一个库,您可能希望将这些示例推到它们自己的包中,这样就可以在Hackage上轻松地发现它们--比如,将其命名为
store-aeson
或其他名称--以减少孤立示例的痛苦。(我梦想有一天有一个可搜索的孤儿示例注册中心......总有一天,在我丰富的空闲时间......)