实例数据。Haskell Aeson的序列
我的下一个问题是实例数据。Haskell Aeson的序列,haskell,aeson,Haskell,Aeson,我的下一个问题是Data.Sequence和Aeson。我想创建我的数据DraftVar派生Generic,它在构造函数DV2上使用data.Sequence {-# LANGUAGE DeriveGeneric, OverloadedStrings #-} -- Imports import Data.Aeson import GHC.Generics import qualified Data.Sequence as DS -- Data data DraftVar =
Data.Sequence
和Aeson。我想创建我的数据DraftVar
派生Generic
,它在构造函数DV2
上使用data.Sequence
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
-- Imports
import Data.Aeson
import GHC.Generics
import qualified Data.Sequence as DS
-- Data
data DraftVar =
DV1 { dv1_val :: Int }
| DV2 { dv2_list :: DS.Seq DraftVar }
deriving (Show, Generic)
instance ToJSON DraftVar
instance FromJSON DraftVar
有了这段代码,我收到一个错误,上面写着:没有(ToJSON(DS.Seq DraftVar))的实例。
。因此,我需要为Aeson库创建Data.Sequence
的实例
在ToJSON
实例声明中,我决定将Data.Sequence
转换为一个列表。代码是:
import Data.Foldable as DF
instance (Show a) => ToJSON (DS.Seq a) where
toJSON l = object [ "values" .= show (DF.toList l) ]
但是,如果我想从这个Json列表中提取数据,然后将数据转换为data.Sequence
,会发生什么呢
instance (Show a) => FromJSON (DS.Seq a) where
parseJSON (Object o) = ???
也许我需要一个库或者一个来自Aeson的特殊函数,我不知道。我发现的最有用的例子是:
您有更好的方法吗?
[]
和Seq
通过fromList
/toList
是同构的(它们只是具有截然不同的表示和性能特征),因此,为Seq
实现FromJSON
和ToJSON
最直接的方法是重新使用[]
的现有实现:
import qualified Data.Sequence as DS
import Data.Foldable as DF
instance (ToJSON a) => ToJSON (DS.Seq a) where
toJSON = toJSON . DF.toList
instance (FromJSON a) => FromJSON (DS.Seq a) where
parseJSON = fmap DS.fromList . parseJSON
你也可以尝试升级;我认为自0.8.1.0以来,
aeson
已经有了Seq
实例。我看到@216; rjan在上面的评论,新版本的aeson
已经有了Seq
实例,但我认为以上是一个足够普遍的技术,值得单独回答。