用 Haskell Aeson 实例 Data.Sequence
Instance Data.Sequence with 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 =
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
你有更好的方法吗?
[]
和 Seq
通过 fromList
/ toList
同构(它们只是具有截然不同的表示和性能特征),因此最直接的实现方式 FromJSON
和 ToJSON
对于 Seq
是通过重新使用 []
:
的现有实现
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
下一个问题是 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
你有更好的方法吗?
[]
和 Seq
通过 fromList
/ toList
同构(它们只是具有截然不同的表示和性能特征),因此最直接的实现方式 FromJSON
和 ToJSON
对于 Seq
是通过重新使用 []
:
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