2017-12-19 4 views
-1

Ich möchte den automatischen DeriveGeneric für meinen parametrisierten Typ verwenden. Ich bekomme einen Fehler. Ich möchte eine Yaml-Datei in FromJSON-Typ dekodieren.Verwenden Sie DeriveGeneric für den parametrierten Typ

{-# 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 

Zeile EPSG * löst Fehler aus. Wie soll ich es beheben?

Antwort

5

Ihre Definition von EPSG muss auch generisch abgeleitet werden, und dann müssen Sie Ihre Instanz darauf beschränken, eine FromJSON Instanz für a zu haben.

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

...

instance FromJSON a => FromJSON (EPSG a) 
+1

Wenn Sie zu 'DeriveAnyClass' haben, können Sie direkt auf' Daten EPSG a = EPSG springen {epsg3857 :: a} Ableitung (Generic, FromJSON) '. – Alec

+0

@Alec Danke für den Tipp! Ersetzt das 'DerivGeneric'? Oder zusätzlich dazu? – jkeuhlen

+0

Nein, Sie brauchen immer noch "DerivGeneric". Die Merkmale sind irgendwie orthogonal. – Alec

Verwandte Themen