J'essaie d'envelopper ma tête autour des GADTs, et je soupçonne qu'il se passe quelque chose de magique que je ne comprends pas.La fonction d'enregistrement de GADT échoue là où la déconstruction réussit
Considérez ce qui suit:
class C t
data T a where
T :: (C a) => { getT :: a } -> T a
f :: C a => a ->()
f = undefined
class D t where
g :: t a ->()
instance D T where
g (T x) = f x
Tout cela est bon et compile avec succès.
Considérons maintenant une définition instance légèrement différente T:
instance D T where
g x = f (getT x)
Cela ressemble exactement la même chose que ci-dessus, mais il y a une erreur de compilation. Qu'est-ce qu'il se passe ici? Le type de données T
n'a pas de variables existentielles, il a une contrainte simple pour son seul constructeur mais c'est tout.
« Le point clé est que sur les GADTs modèle des causes de type raffinement correspondant. » - [Les utilisateurs GHC Guide] (https://downloads.haskell.org/ ~ ghc/8.0.1-rc2/docs/html/users_guide/glasgow_exts.html # généralisé-algébrique-types-de-données-gadgets). Lorsque vous utilisez la correspondance de modèle avec une équation ou 'case', le typechecker a une portée évidente dans laquelle affiner localement le type et ajouter des contraintes au contexte. L'accesseur d'enregistrement ne «fuit» pas les contraintes dans le contexte environnant. –