Inférence de type basée sur des contraintes avec des données algébriques

11

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 eest a + b, e : Int, a : Intet b : Int. Si ec'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 adans 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!

Kris
la source
@Guy Je ne veux pas paraître ingrat, mais je ne cherche pas une solution standard - avez-vous des suggestions? La plupart des documents existants que j'ai pu trouver (comme les articles de l'INRIA sur ML, OCaml ...) sont beaucoup plus vastes que ce dont j'ai besoin (et je suis capable de les comprendre).
Kris
Je commencerais par le chapitre d'inférence dans ATTAPL , je pense qu'ils discutent de tout ce dont vous avez besoin à un niveau accessible.
Gilles 'SO- arrête d'être méchant'
@Gilles Je pense qu'ATTAPL est le seul livre PL 'classique' que je n'ai pas sur ma bibliothèque: P Mais merci, je vais jeter un coup d'œil lundi, je m'assois sur un étage chez Uni avec peut-être 10 exemplaires répartis dans les bureaux: )
Kris
@Kris avez-vous déjà trouvé une ressource accessible pour résoudre ce problème? Mon implémentation d'un "mini ML" est bloquée sur exactement ce problème ... Je pense avoir trouvé le chapitre pertinent d'ATTAPL ( pauillac.inria.fr/~fpottier/publis/emlti-final.pdf ) et survolé la section sur l'algèbre types de données, mais je crains que ce soit un peu au-dessus de ma tête.
michiakig
@spacemanaki Oui, depuis, j'ai trouvé que pdfs.semanticscholar.org/8983/… est une excellente ressource pour cela.
Kris

Réponses:

2

Voir: Mini ML spécifiquement la section d'inférence de type.

Il contient un exemple de code en F # pour un analyseur complet d'un langage fonctionnel simple. Plus important encore, la section Inférence de type implémente l'algorithme Hindley-Milner, qui se trouve dans la plupart des systèmes d'inférence de type. L'auteur fournit également des liens vers deux autres documents importants pour aider à comprendre Hindley-Milner; l'un étant une sorte d'introduction de haut niveau et l'autre étant un document qui décrit la mise en œuvre de l'algorithme dans le code.

Guy Coder
la source
Les liens uniques ne sont généralement pas une réponse. Veuillez expliquer ce qui peut y être trouvé et pourquoi cela aide.
Raphael