Disons que j'ai un GADT comme celui-ci :
data Term a where
Lit :: a -> Term a
Succ :: Term Int -> Term Int
IsZero :: Term Int -> Term Bool
If :: Term Bool -> Term a -> Term a -> Term a
Est-il possible de stocker Succ (Lit 2)
y IsZero (Succ (Lit 2))
dans le transformateur de la monade State, en tant que valeur de l'état interne ?
Le problème ici est que ces deux-là sont de types différents, et je ne sais pas comment le s
de StateT s m a
doivent être tapés.
Edit : ATerm
a résolu la question initiale de savoir comment stocker différentes GADT
dans l'état, le problème maintenant est que depuis que le type est perdu, il semble impossible de comparer l'ancien et le nouvel état.
Edit : Réponse finale.
Après avoir échangé avec @luqui, voici l'extrait de code complet qui répond à cette question.
N'hésitez pas à le faire. repl et faire un essai.
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}
import Data.Typeable
data Term a where
Lit :: a -> Term a
Succ :: Term Int -> Term Int
IsZero :: Term Int -> Term Bool
If :: Term Bool -> Term a -> Term a -> Term a
deriving instance (Eq a) => Eq (Term a)
data ATerm where
ATerm :: (Typeable a, Eq a) => Term a -> ATerm
instance Eq ATerm where
ATerm t == ATerm u
| Just t' <- cast t = t' == u
| otherwise = False
main :: IO ()
main = return ()