Essayant de faire le JSON de-sérialisation pour un type de données avec TypeLits, je reçois coincé avec le problème suivant:exemple FromJSON avec 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)
Comment serait la syntaxe correcte pour permettre Nat génériquement en le FromJSON exemple dans l'exemple suivant:
{-# 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
Vous avez probablement besoin d'instances séparées pour 'FromJSON (X 1)' et 'FromJSON (X 2)', ou faites une typecase sur 'n' (en utilisant un singleton). La façon dont vous avez écrit l'instance indique que vous pouvez lire «X n» pour tout «n» que l'appelant * choisit. – luqui