【问题标题】:Instance Data.Sequence with Haskell AesonHaskell Aeson 的实例 Data.Sequence
【发布时间】: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 实例。

标签: haskell aeson


【解决方案1】:

[]Seq 通过 fromList / toList 同构(它们只是具有完全不同的表示和性能特征),因此实现 FromJSONToJSON 的最直接方法是 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

【讨论】:

  • 我在上面看到@Ørjan 的评论,aeson 的较新版本已经有 Seq 实例,但我认为以上是一种足够通用的技术,值得单独回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多