Je travaille sur un langage d'expression de la généalogie ML, il a donc naturellement besoin d'une inférence de type> :)
Maintenant, j'essaie d'étendre une solution basée sur des contraintes au problème de l'inférence des types, basée sur une implémentation simple en EOPL (Friedman et Wand), mais ils décalent élégamment les types de données algébriques.
Ce que j'ai jusqu'à présent fonctionne bien; si une expression e
est a + b
, e : Int
, a : Int
et b : Int
. Si e
c'est un match,
match n with
| 0 -> 1
| n' -> n' * fac(n - 1)`,
Je peux à juste titre déduire que t(e) = t(the whole match expression)
, t(n) = t(0) = t(n')
, t(match) = t(1) = t(n' * fac(n - 1)
et ainsi de suite ...
Mais je ne suis pas très sûr en ce qui concerne les types de données algébriques. Supposons une fonction comme un filtre:
let filter pred list =
match list with
| Empty -> Empty
| Cons(e, ls') when pred e -> Cons (e, filter ls')
| Cons(_, ls') -> filter
Pour que le type de liste reste polymorphe, Cons doit être de type a * a list -> a list
. Donc, en établissant ces contraintes, j'ai évidemment besoin de rechercher ces types de mes constructeurs algébriques - le problème que j'ai maintenant est la `` sensibilité au contexte '' des utilisations multiples des constructeurs algébriques - comment puis-je exprimer dans mes équations de contraintes que le a
dans chaque cas doit être le même?
J'ai du mal à trouver une solution générale à ce problème et je ne trouve pas beaucoup de documentation à ce sujet. Chaque fois que je trouve quelque chose de similaire - un langage basé sur l'expression avec une inférence de type basée sur des contraintes - ils s'arrêtent juste avant les types de données algébriques et le polymorphisme.
Toute contribution est très appréciée!