Используйте DeriveGeneric для параметризованного типа

Я хочу использовать автоматизированный DeriveGeneric для моего параметризованного типа. Я получаю ошибку. Я хочу декодировать файл yaml типа FromJSON.

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies  #-}

import Web.Scotty
import Data.ByteString.Char8 (pack, unpack)
import Data.ByteString.Lazy (toStrict, fromStrict)
import Data.List
import Data.Yaml
import GHC.Generics

data EPSG a = EPSG { epsg3857 :: a }

data Resolution = Resolution { max :: Int, items :: [Double]}

data Config = Config { minX :: EPSG Double, minY :: EPSG Double, maxX :: EPSG Double, maxY :: EPSG Double
                   , resolution :: EPSG Resolution
                   , metersPerUnit :: EPSG Double
                   , pixelSize :: EPSG Double
                   , scaleNames :: EPSG [String]
                   , tileWidth :: EPSG Double
                   , tileHeight :: EPSG Double
                   , subdirBit :: EPSG [Int]
                   , subdirShiftBit :: EPSG [Int]
                   , subdirNumSize :: EPSG [Int]
                   , fileNameNumSize :: EPSG [Int] } deriving Generic

instance FromJSON EPSG *
instance FromJSON Resolution
instance FromJSON Config

Строка EPSG * вызывает ошибку. Как мне это исправить?


person Kamyar    schedule 19.12.2017    source источник


Ответы (1)


Ваше определение EPSG также должно быть общим, а затем вам нужно ограничить свой экземпляр, чтобы он также имел экземпляр FromJSON для a.

data EPSG a = EPSG { epsg3857 :: a } deriving Generic

...

instance FromJSON a => FromJSON (EPSG a)
person jkeuhlen    schedule 19.12.2017
comment
Если у вас также включен DeriveAnyClass, вы можете сразу перейти к data EPSG a = EPSG { epsg3857 :: a } deriving (Generic, FromJSON). - person Alec; 19.12.2017
comment
@Алек Спасибо за совет! Это заменяет DeriveGeneric? Или в дополнение к нему? - person jkeuhlen; 19.12.2017
comment
Нет, вам все еще нужен «DeriveGeneric». Черты вроде ортогональны. - person Alec; 19.12.2017