【发布时间】:2015-08-01 23:10:22
【问题描述】:
我有 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
使用此代码,我收到错误消息: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
你有更好的方法吗?
【问题讨论】:
-
您也可以尝试升级;我认为
aeson自 0.8.1.0 以来就有Seq实例。