915 votes

« Quelle partie de Hindley-Milner ne comprenez-vous pas ? »

Je ne peux pas le trouver maintenant, mais je vous jure , il y avait un T-shirt pour la vente mettant en vedette les mots immortels:


Quelle partie de

Milney Hindley

avez-vous pas comprendre?


Dans mon cas, la réponse serait... le tout!

En particulier, je vois souvent la notation de ce genre dans Haskell papiers, mais je n'ai aucune idée de ce qu'est l'enfer tout ça signifie. Je n'ai aucune idée de ce que branche des mathématiques qu'il est censé être.

- Je reconnaître les lettres de l'alphabet grec, bien sûr, et des symboles tels que "∉" (qui signifie en général que quelque chose n'est pas un élément d'un ensemble).

D'autre part, je n'ai jamais vu "⊢" avant (Wikipedia prétend qu'il peut signifier "partition"). Je suis aussi familier avec l'utilisation de la vinculum ici. (En général, il désigne une fraction, mais cela ne semble être le cas ici.)

J'imagine que ce n'est pas un bon endroit pour être à expliquer l'ensemble de Milner Hindley algorithme. Mais si quelqu'un pourrait au moins me dire où commencer à chercher à comprendre ce que cette mer de symboles veut dire, que ce serait utile. (Je suis sûr que je ne peux pas être la seule personne à qui vous demandez-vous...)

700voto

Dan Burton Points 26639
  • La barre horizontale signifie que "[ci-dessus] implique [ci-dessous]".
  • Si il y a plusieurs expressions dans [ci-dessus], pour ensuite les examiner anded ensemble; tous les [ci-dessus] doivent être remplies afin de garantir la [ci-dessous].
  • : moyen est de type
  • moyen est dans. (De même, moyen "n'est pas en".)
  • Γ est généralement utilisé pour faire référence à un environnement ou du contexte; dans ce cas, il peut être considéré comme un ensemble d'annotations de type, l'association d'un identifiant avec son type. Par conséquent, x : σ ∈ Γ signifie que l'environnement Γ inclut le fait que x type σ.
  • peut être lu comme le prouve ou détermine. Γ ⊢ x : σ signifie que l'environnement Γ détermine qu' x type σ.
  • , est une façon de s' y compris supplémentaires spécifiques des hypothèses dans un environnement Γ.
    Par conséquent, Γ, x : τ ⊢ e : τ' signifie que l'environnement Γ avec les autres, en remplaçant l'hypothèse qu' x type τ prouve qu' e type τ'.

340voto

Tikhon Jelvis Points 30789

Cette syntaxe, tandis qu'il peut sembler compliqué, est en fait assez simple. L'idée de base vient de la logique: l'expression entière est une implication avec la moitié supérieure étant les hypothèses et la moitié inférieure étant le résultat. C'est, si vous savez que le haut expressions sont vraies, vous pouvez en conclure que le fond expressions sont vraies.

Symboles

Une autre chose à garder à l'esprit est que certaines lettres ont traditionnel des significations; en particulier, Γ représente le "contexte" vous êtes-c'est ce que les autres types de choses que vous avez vu. Donc, quelque chose comme Γ ⊢ ... moyen ", l'expression" ... quand vous savez que les types de chaque expression en Γ.

L' symbole signifie essentiellement que vous pouvez prouver quelque chose. Donc, Γ ⊢ ... est une déclaration disant: "je peux le prouver ... dans un contexte Γ. Ces déclarations sont également appelés type de jugements.

Une autre chose à garder à l'esprit: en mathématiques, tout comme ML et Scala, x : σ signifie qu' x type σ. Vous pouvez le lire comme Haskell x :: σ.

Ce que chaque règle signifie

Donc, sachant cela, la première expression devient facile à comprendre: si nous savons que l' x : σ ∈ Γ (c'est - x a un certain type σ dans certains contexte, Γ), alors nous savons qu' Γ ⊢ x : σ (qui est, en Γ, x type σ). Alors, vraiment, ce n'est pas en vous disant quelque chose de super-intéressant; il indique simplement comment utiliser votre contexte.

Les autres règles sont aussi simples. Prenez, par exemple, [App]. Cette règle a deux conditions: e₀ est une fonction à partir d'un certain type τ pour certains type τ' et e₁ est une valeur de type τ. Maintenant, vous savez quel type vous obtiendrez en appliquant e₀ de e₁! J'espère que ce n'est pas une surprise :).

La règle suivante a plus de nouvelle syntaxe. En particulier, Γ, x : τ signifie que le contexte constitué d' Γ , et le jugement x : τ. Donc, si nous savons que la variable x a un type d' τ et l'expression e a un type τ', nous avons également connaître le type d'une fonction qui prend en x et retours e. Cette juste nous dit quoi faire si nous avons compris ce type de fonction prend et le type de retours, donc il ne devrait pas être surprenant.

La prochaine on vous dit comment manipuler let des déclarations. Si vous savez que certains d'expression e₁ a un type τ tant que x a un type σ, puis un let expression qui localement se lie x pour une valeur de type σ feront e₁ avoir un type τ. Vraiment, cela vous indique que l'instruction let vous permet essentiellement d'étendre le contexte avec une nouvelle liaison qui est exactement ce qu' let !

L' [Inst] règle concerne le sous-typage. Il est dit que si vous avez une valeur de type σ' et c'est un sous-type d' σ ( représente un partiel de la commande de rapport), alors que l'expression est également de type σ.

La règle finale traite avec la généralisation des types. Un rapide aparté: gratuitement une variable est une variable qui n'est pas introduite par un laisser-déclaration ou lambda à l'intérieur de certaines expression; cette expression dépend aujourd'hui de la valeur de la variable indépendante de son contexte.La règle est de dire que si y est une variable α qui n'est pas "libre" dans quoi que ce soit dans votre contexte, alors il est sûr de dire que toute expression dont le type que vous connaissez e : σ aura ce type pour toute valeur de α.

Comment utiliser les règles

Donc, maintenant que vous comprenez les symboles, que faites-vous avec ces règles? Eh bien, vous pouvez utiliser ces règles pour déterminer le type de valeurs différentes. Pour ce faire, regardez votre expression (disons f x y) et de trouver une règle qui a une conclusion (la partie inférieure) qui correspond à votre déclaration. Appelons-la chose que vous essayez de trouver votre "objectif". Dans ce cas, vous auriez l'air à la règle qui se termine en e₀ e₁. Lorsque vous avez trouvé cela, vous devez maintenant trouver des règles de prouver tout au-dessus de la ligne de cette règle. Ces choses correspondent généralement aux types de sous-expressions, de sorte que vous êtes essentiellement recursing sur les parties de l'expression. Vous venez de le faire jusqu'à la fin de votre preuve d'arbre, ce qui vous donne une preuve de la nature de votre expression.

Donc, toutes ces règles de faire est de spécifier exactement-et dans l'habitude mathématiquement pédant détail :P-comment déterminer les types d'expressions.

Maintenant, cela doit vous sembler familières si vous avez déjà utilisé Prolog-vous êtes essentiellement le calcul de la preuve de l'arbre comme un être humain interprète Prolog. Il y a une raison Prolog est appelé "programmation logique"! C'est aussi important que le premier moyen que j'ai été initié à la H-M algorithme d'inférence a été mise en œuvre dans Prolog. C'est en fait étonnamment simple et fait ce qu'il se passe clairement. Vous devriez certainement essayer.

Note: j'ai probablement fait quelques erreurs dans cette explication et l'aimerais si quelqu'un de vous les montrer. Je vais couvrir ce dans la classe à un couple de semaines, donc je vais être plus confiants alors :P.

77voto

Don Stewart Points 94361

si quelqu'un pourrait au moins me dire où commencer à chercher à comprendre ce que cette mer de symboles signifie

Voir "Pratique Fondements des Langages de Programmation.", les chapitres 2 et 3, sur le style de la logique par le biais de jugements et de dérivations. Le livre est maintenant disponible sur Amazon.

Chapitre 2

Définitions Inductives

Inductive définitions sont un outil indispensable dans l'étude des langages de programmation. Dans ce chapitre, nous allons développer le cadre de base de définitions inductives, et donner quelques exemples de leur utilisation. Une définition inductive consiste en un ensemble de règles pour tirer des jugements, ou d' affirmations, d'une variété de formes. Les jugements sont des énoncés au sujet de un ou plusieurs syntaxique des objets d'une certaine sorte. Le règlement intérieur précisera les conditions nécessaires et suffisantes pour la validité d'un jugement, et donc de déterminer pleinement son sens.

2.1 Jugements

Nous commençons par la notion d'un jugement, ou d'assertion au sujet syntaxique d'objet. Nous allons faire usage de beaucoup de formes de jugement, y compris des exemples comme ceux-ci:

  • n nat - n est un nombre naturel
  • n = n1 + n2 - n est la somme de n1 et n2
  • τ type - τ est un type
  • e : τ - expression e a le type τ
  • ev - expression e a la valeur v

Un jugement indique qu'une ou plusieurs syntaxique objets ont une propriété ou debout dans une relation à une autre. La propriété ou de la relation elle-même est appelée formule de jugement, et le jugement qu'un objet ou des objets qui ont la propriété ou le support de cette relation est dit être un exemple de cette formule de jugement. Un jugement de la forme est aussi appelé un prédicat, et les objets constituant une instance sont ses sujets. Nous écrire un J pour le jugement en affirmant que J est titulaire d' une. Quand il n'est pas important d'insister sur le sujet de l'arrêt, (texte de couper ici)

50voto

nponeccop Points 8111

La notation vient de déduction naturelle.

⊢ symbole est appelé tourniquet.

Les 6 règles sont très simples.

Var règle est plutôt trivial règle: il dit que si le type de l'identificateur est déjà présent dans votre environnement de type, puis d'en déduire le type que vous venez de prendre de l'environnement.

App règle dit que si vous avez deux identificateurs e0 et e1 et peuvent déduire de leurs types, alors vous pouvez déduire le type d'application, e0 e1. Le règlement se lit comme cela si vous savez qu' e0 :: t0 -> t1 et e1 :: t0 (le même t0!), ensuite, l'application est bien tapé et le type est - t1.

Abs et Let sont des règles d'inférer les types de lambda-abstraction et laissez-en.

Inst règle dit que vous pouvez remplacer par un type avec moins d'ordre général.

35voto

laslowh Points 3209

J'imagine que ce n'est pas un bon endroit pour être à expliquer l'ensemble de Milner Hindley algorithme.

Si vous êtes à la recherche pour une bonne explication de l'algorithme, le meilleur que j'ai trouvé pour l'instant est dans le chapitre 30 de Shriram Krinshnamurthi de Langages de Programmation: Application et de l'Interprétation (sous licence CC!). Voici une bonne raison pourquoi c'est une bonne explication: des exemples!

enter image description here

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