Данные экземпляра. Последовательность с 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)). Итак, мне нужно создать экземпляр Data.Sequence для библиотеки Aeson.

В объявлении экземпляра 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, я не знаю. Самый полезный пример (который я нашел) таков: Анализ массива с помощью Haskell Aeson

У вас есть подход получше?


person tonylattke    schedule 31.07.2015    source источник
comment
Вы также можете попробовать обновить; Я думаю, что у aeson было Seq экземпляров с 0.8.1.0.   -  person Ørjan Johansen    schedule 01.08.2015


Ответы (1)


[] и 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
person Cactus    schedule 01.08.2015
comment
Я видел комментарий @ Ørjan выше, что в новых версиях aeson уже есть Seq экземпляры, но я думаю, что приведенный выше метод является достаточно общим, чтобы заслужить ответ сам по себе. - person Cactus; 01.08.2015