Il est regrettable qu'une grande partie de la littérature sur le sujet est très dense. Moi aussi j'ai été dans vos chaussures. J'ai eu ma première introduction aux Langages de Programmation: Applications et Interprétation
http://www.plai.org/
Je vais essayer de résumer l'idée abstraite suivis par les détails que je n'ai pas trouvé tout de suite évident. Tout d'abord, l'inférence de type peut être la pensée de la génération, puis la résolution de contraintes. Pour générer des contraintes, vous recurse par le biais de l'arbre de syntaxe et de générer une ou plusieurs contraintes sur chaque nœud. Par exemple, si le nœud est un opérateur"+", les opérandes et les résultats doivent tous être des nombres. Un nœud qui applique une fonction a le même type que le résultat de la fonction, et ainsi de suite.
Pour une langue sans 'laisser', vous pouvez aveuglément résoudre les contraintes ci-dessus par substitution. Par exemple:
(if (= 1 2)
1
2)
ici, nous pouvons dire que la condition de l'instruction if doit être de type boolean, et que le type de l'instruction if est le même que le type de son "puis" et "else" clauses. Depuis que nous savons que 1 et 2 sont des nombres, par substitution, nous savons que l'instruction "if" est un nombre.
Là où les choses deviennent méchants, et que je ne pouvais pas comprendre pour un certain temps, est de traiter avec laisser:
(let ((id (lambda (x) x)))
(id id))
Ici, nous avons tenu 'id' pour une fonction qui renvoie ce que vous avez transmis, autrement connu comme la fonction identité. Le problème, c'est le type de paramètre de la fonction " x " est différent sur chaque type d'utilisation de l'id. Le deuxième 'id' est une fonction de a->a, où a peut être rien. La première est de (a->a)->(a->a), de Ce qui est connu comme laissez-le polymorphisme. La clé est de résoudre des contraintes dans un ordre précis: d'abord résoudre les contraintes de la définition de "id". Ce sera un->un. Puis frais, des copies distinctes du type de pièce d'identité peut être substitué dans les contraintes pour chaque lieu de " id " est utilisé, par exemple a2->a2 et a3>a3.
Qui n'a pas été facilement expliqué dans les ressources en ligne. Ils vais vous parler de l'algorithme W ou M, mais pas de la façon dont ils travaillent en terme de résolution de contraintes, ou pourquoi il n'a pas barf sur laissez-polymorphisme: chacun de ces algorithmes d'exécuter une commande sur la résolution de contraintes.
J'ai trouvé cette ressource extrêmement utile pour attacher Algorithme W, M, et le concept général de la contrainte de la génération et de la résolution de l'ensemble. C'est un peu dense, mais mieux que beaucoup d'autres:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
De nombreux autres documents sont sympa aussi:
http://people.cs.uu.nl/bastiaan/papers.html
J'espère que permet de clarifier un peu glauque du monde.