实例Data.Sequence与Haskell Aeson

时间:2015-07-31 23:37:57

标签: haskell aeson

我有Data.Sequence和Aeson的下一个问题。我想创建导出DraftVar的数据Generic,在构造函数Data.Sequence上使用DV2

{-# 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

使用此代码,我会收到错误消息:No instance for (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的图书馆或特殊功能,我不知道。最有用的例子(我发现)是:Parsing an Array with Haskell Aeson

你有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

[]Seq通过fromList / toList同构(它们只有极为不同的表示和性能特征),因此最直接的实现方式{{1 } FromJSONToJSON通过重复使用Seq的现有实现:

[]