TypeLits を使用してデータ型の JSON デシリアライズを実行しようとすると、次の問題が発生します。
タイプ 'n' を '2' と一致させることができませんでした 'n' は、によってバインドされた固定型変数です。 test.hs:14:10 でのインスタンス宣言 予想されるタイプ: aeson-0.11.2.1:Data.Aeson.Types.Internal.Parser (Xn) 実際のタイプ: aeson-0.11.2.1:Data.Aeson.Types.Internal.Parser (×2)
次の例で、 FromJSONインスタンスで一般的にNatを許可する正しい構文はどのようになるでしょうか。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
import GHC.TypeLits
import Data.Aeson
import Control.Monad (mzero)
data X (n :: Nat) where
A :: Integer -> X 1
B :: Integer -> X 2
instance FromJSON (X n) where
parseJSON (Object o) = do
v <- o .: "val"
t <- o .: "type"
case t of
"a" -> return $ A v
"b" -> return $ B v
parseJSON _ = mzero