Dans ma recherche d'articles de recherche sur les systèmes de types pour les langages impératifs, je ne trouve que des solutions pour un langage avec des références mutables mais sans véritables structures de contrôle impératif telles que des opérateurs composés, des boucles ou des conditionnelles.
Il n'est donc pas clair comment un langage impératif avec inférence de type partielle tel que http://rust-lang.org peut être implémenté.
Les articles ne mentionnent pas les types paramétrés tels que List of a
parce que les types paramétrés sont une extension triviale du système de type Hindley-Milner - seul l'algorithme d'unification doit être étendu, et le reste de l'inférence fonctionne tel quel. Cependant, les affectations ne peuvent pas être ajoutées de manière triviale car des paradoxes surviennent, donc des techniques spéciales telles que la restriction de la valeur ML doivent être appliquées.
Pouvez-vous recommander des articles ou des livres décrivant un système de types pour une langue avec des boucles impératives, des conditions, des entrées-sorties et des instructions composées?
la source
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end
. Donc, au niveau d'une question de recherche, la réponse que vous recherchez est-elle «d'appliquer des techniques développées en Caml / SML, y compris la restriction de valeur»?Réponses:
Si vous recherchez une référence fonctionnelle et soignée à l'inférence de type, je suis un peu partial à Gundry, McBride et McKinna 2010 " Type Inference in Context ", bien que cela ne soit pas un bon guide pour les implémentations existantes réelles .
Je pense qu'une partie de la réponse est que, au-delà de la restriction de valeur, il n'y a vraiment pas beaucoup de difficulté à adapter l'inférence de type Hindley-Milner aux langues impératives: si vous définissez
e1; e2
comme sucre syntaxique pour(fn _ => e2) e1
et définissezwhile e1 do e2
comme sucre syntaxique pourwhiledo e1 (fn () => e2)
, oùwhiledo
est un régulier fonction récursivealors tout fonctionnera bien, y compris l' inférence de type.
Quant à la restriction de valeur étant une technique spéciale, j'aime l'histoire suivante; Je suis presque sûr de l'avoir récupéré auprès de Karl Crary. Considérez le code suivant, dont la restriction de valeur vous empêchera d'écrire en ML:
Comparez-le au code suivant, ce qui ne pose aucun problème:
Nous savons ce que fait le deuxième exemple: il crée deux nouvelles cellules ref contenant
NONE
, puis metSOME 5
dans le premier (anint option ref
), puis metSOME "Hello"
dans le second (astring option ref
).Mais réfléchissez au premier exemple en termes de représentation∀α.ref(option(α)) Λα.ref[α](NONE) ".
x
dans le système F (le lambda-calcul polymorphe). Dans un tel paramètre,x
serait une valeur de type " ", ce qui signifie que, comme terme, la valeur de doit être un (type) lambda: "x
Cela suggérerait qu'un «bon» comportement du premier exemple consiste à se comporter exactement de la même manière que le deuxième exemple - instancier le lambda de niveau type à deux moments différents. La première fois que nous instancions
x
avecint
, ce qui entraînerax [int]
d'évaluer une tenue de cellule de référenceNONE
puisSOME 5
. La deuxième fois, nous instancionsx
avecstring
, ce qui sera le casx [string]
pour évaluer une cellule de référence ( différente! )NONE
Et ensuiteSOME "Hello"
. Ce comportement est "correct" (type-safe), mais ce n'est certainement pas ce à quoi un programmeur s'attendrait, et c'est pourquoi nous avons la restriction de valeur en ML, pour éviter aux programmeurs de gérer ce type de comportement inattendu.la source
e1; e2
contient une parenthèse non appariée et un point-virgule (qu'elle est censée définir). Vous vouliez dire(fn _ => e2) e1
?La thèse de Xavier Leroy est un bon début.
la source
Je suis désolé d'avoir répondu à ma propre question, mais la référence en question est
Une proposition de norme ML , Milner, 1983
La partie 6 "Formes dérivées standard" couvre assez largement le désuchage des constructions impératives. Et jusqu'à présent, c'est la première référence de ces transformations largement évidentes que j'ai pu trouver.
la source