Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实例数据。Haskell Aeson的序列_Haskell_Aeson - Fatal编程技术网

实例数据。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
实例,但我认为以上是一个足够普遍的技术,值得单独回答。