Der Versuch, die JSON-de-Serialisierung für einen Datentyp mit TypeLits zu tun, erhalte ich mit dem folgenden Problem stecken:FromJSON Instanz mit DataKinds
Couldn't match type ‘n’ with ‘2’ ‘n’ is a rigid type variable bound by the instance declaration at test.hs:14:10 Expected type: aeson-0.11.2.1:Data.Aeson.Types.Internal.Parser (X n) Actual type: aeson-0.11.2.1:Data.Aeson.Types.Internal.Parser (X 2)
Wie wäre es, die korrekte Syntax Nat allgemein in ermöglichen, die FromJSON Instanz in folgendem Beispiel:
{-# 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
Sie benötigen wahrscheinlich separate Instanzen für 'FromJSON (X 1)' und 'FromJSON (X 2)', oder tun Sie einen Schreibweisen auf 'n' (mit einem Singleton). Die Art, wie Sie die Instanz geschrieben haben, besagt, dass Sie "X n" für jedes "n" lesen können, das der * Aufrufer * wählt. – luqui