2017-12-19 17 views
-1

パラメータ化された型に自動DerivativeGenericを使用したい。私はエラーが発生します。 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

関連する問題