145 votes

Qu'est-ce que Hindley-Milner?

J'ai rencontré ce terme de "Hindley-Milner", dont je ne suis pas sûr de saisir ce que cela signifie. J'ai lu Steve Yegge "Dynamique des Langues Strike Back" et "Le Pinocchio Problème" et Daniel Spiewak "qu'est-Ce que Hindley-Milner? (et pourquoi est-il cool?)". Mais il n'y a pas d'entrée unique pour ce terme dans wikipédia où, généralement, me propose une explication concise.

Quel est-il? Quels langages et outils à mettre en œuvre ou de l'utiliser?

Voulez-vous s'il vous plaît offrir une réponse concise? Merci.

185voto

Norman Ramsey Points 115730

Hindley-Milner est un système de type découvert indépendamment par Roger Hindley (qui était à la recherche à la logique) et, plus tard, par Robin Milner (qui était à la recherche à des langages de programmation). Les avantages de Hindley-Milner sont

  • Il prend en charge polymorphes fonctions; par exemple, une fonction qui peut vous donner la longueur de la liste indépendante du type des éléments, ou une fonction binaire de l'arbre de recherche indépendant du type de clés stockées dans l'arbre.

  • Parfois, une fonction ou d'une valeur de plus d'un type, comme dans l'exemple de la longueur de la fonction: il peut être "liste d'entiers integer", "liste de chaînes de caractères en entier", "liste de paires d'entiers", et ainsi de suite. Dans ce cas, un signal parti de la Hindley-Milner système est que chaque bien tapé terme unique de "meilleur" de type, qui est appelé le type principal. Le principal type de liste de la longueur de la fonction est "pour n'importe quel a, en fonction de la liste d' a entier". Ici, a est un soi-disant "paramètre de type," ce qui est explicite dans le lambda calcul , mais implicite dans la plupart des langages de programmation. L'utilisation de paramètres de type explique pourquoi Hindley-Milner est un système qui met en œuvre paramétrique polymorphisme. (Si vous écrivez une définition de la longueur de la fonction en ML, vous pouvez voir le type de paramètre ainsi:

     fun 'a length []      = 0
       | 'a length (x::xs) = 1 + length xs
    
  • Si un terme a une Hindley-Milner type, puis le type principal peut être déduit sans exiger n'importe quel type de déclarations ou d'autres annotations par le programmeur. (C'est une arme à double tranchant, car tout le monde peut en témoigner, qui n'a jamais été traité une grande partie de la ML code sans annotations.)

Hindley-Milner est la base pour le système de type de presque tous les statiquement typé langage fonctionnel. Ces langues dans l'usage commun comprennent

Toutes ces langues ont étendu Hindley-Milner; Haskell, Propre et Objective Caml faire dans ambitieuse et inédite. (Les Extensions sont nécessaires pour traiter mutable variables, depuis la base de Hindley-Milner peut être subverti en utilisant, par exemple, une mutable cellule de la tenue d'une liste de valeurs de type non spécifié. De tels problèmes sont traités par une extension appelée la valeur de restriction.)

De nombreuses autres langues mineures et des outils basés sur des langages fonctionnels typés utilisation de Hindley-Milner.

Hindley-Milner est la restriction de F, ce qui permet plus de types, mais qui nécessite des annotations par le programmeur.

13voto

tvanfosson Points 268301

Vous pouvez être en mesure de trouver l'origine des documents à l'aide de Google Scholar ou CiteSeer -- ou votre local de la bibliothèque de l'université. La première est assez vieux que vous pourriez avoir à trouver des exemplaires reliés de la revue, je ne pouvais pas le trouver en ligne. Le lien que j'ai trouvé pour l'autre était cassé, mais il pourrait y en avoir d'autres. Vous aurez certainement être en mesure de trouver des articles qui citent ces.

Hindley, Roger J, Le principal type de régime d'un objet combinatoire logique, Transactions of the American Mathematical Society, 1969.

Milner, Robin, Une Théorie de Type Polymorphisme, Journal de l'Informatique et des Sciences du Système, 1978.

7voto

Richard A Points 1745

Référence Wikipedia

Suffisamment concis?

6voto

YSharp Points 111

Simple Hindley-Milner, l'inférence de type mise en œuvre en C#

et son équivalent, avec une démonstration en ligne

Simple Hindley-Milner, l'inférence de type implémentation en JavaScript

Remarque: les deux implémentations sont dans la gamme de seulement 250 lignes de code (pour l'algorithme W bon et les quelques structures de données à l'appui, de toute façon).

Voir aussi Brian McKenna JavaScript de la mise en œuvre de Hindley-Milner, l'inférence de type (Algorithme W) sur bitbucket, ce qui contribue aussi à démarrer (a fonctionné pour moi).

3voto

HoloEd Points 31

Implémentation simple de l'inférence de type Hindley Milner en fa #

http://fsharpcode.blogspot.com/2010/08/hindley-milner-type-inference-sample.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X