2017-12-19 12 views
-1

매개 변수화 된 유형에 대해 자동화 된 DeriveGeneric을 사용하고 싶습니다. 나는 오류가 발생합니다. FromJSON 형식의 yaml 파일을 디코드하고 싶습니다.DeriveGeneric을 매개 변수화 된 유형으로 사용하십시오.

{-# 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 *가 발생합니다. 어떻게 수정해야합니까?

답변

5

귀하의 정의가 EPSG 일 경우 일반을 파생해야하며 a의 인스턴스도 FromJSON이되도록 제한해야합니다.

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

...

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

너무에서'DeriveAnyClass'이있는 경우, 데이터 EPSG의 A = EPSG'로 바로 이동할 수 있습니다 {epsg3857 : A} (일반, FromJSON)을'유도. – Alec

+0

@Alec 팁 주셔서 감사! 그게'DeriveGeneric'을 대체합니까? 아니면 그 외에? – jkeuhlen

+0

아니, 'DeriveGeneric'도 필요합니다. 기능은 직각의 일종입니다. – Alec