Höhere Arten gehen über das grundlegende Hindley-Milner-Typsystem hinaus, aber sie können auf die gleiche Weise behandelt werden.
Sehr grob, analysiert HM den Syntaxbaum eines Ausdrucks, ordnet jedem Unterausdruck eine freie Typvariable zu und generiert einen Satz von Gleichungsbedingungen gegenüber Typbegriffen, die Typvariablen gemäß den Typisierungsregeln enthalten. Das gleiche kann mit höheren Arten gemacht werden.
Dann werden die Einschränkungen durch Vereinheitlichung gelöst. Ein typischer Schritt bei der Vereinigung Algorithmus (pseudo-Haskell folgt)
(F t1 ... tn := G s1 ... sk) =
| n/=k || F/=G -> fail
| otherwise -> { t1 := s1 , ... , tn := sn }
(Beachten Sie, dass dies nur ein Teil des Unifikationsalgorithmus.)
Above F
, G
sind Typkonstruktor Symbole, und nicht Variablen. Bei der höheren Vereinheitlichung müssen wir auch die Variablen F
, G
berücksichtigen. Wir könnten versuchen, die folgende Regel:
(f t1 ... tn := g s1 ... sk) =
| n/=k -> fail
| otherwise -> { f := g , t1 := s1 , ... , tn := sn }
Aber warten Sie! Das obige ist nicht korrekt, da z.B. f Int ~ Either Bool Int
muss vereinheitlichen, wenn f ~ Either Bool
. Also müssen wir auch den Fall betrachten, wo n/=k
.Im Allgemeinen ist ein einfacher Regelsatz ist
(f t := g s) =
{ f := g , t := s }
(F := G) = -- rule for atomic terms
| F /= G -> fail
| otherwise -> {}
(Auch dies ist nur ein Teil des Unifikationsalgorithmus. Andere Fälle auch behandelt werden müssen, wie Andreas Roßberg unten weist darauf hin.)
Diese Antwort ist irreführend, denke ich. Vereinheitlichung höherer Ordnung ist komplizierter. Zum Beispiel sehe ich nicht, dass Ihre Regeln Basisfälle behandeln wie '(F: = g t)'. Im Allgemeinen gibt es keine eindeutige Lösung, und das Problem ist auch nicht entscheidbar. Sie müssen den Problembereich stark einschränken, um dies zu vermeiden (was Haskell tut, indem er beispielsweise die Verwendung von Typ-Synonymen einschränkt). –
@AndreasRossberg Ich habe es ausdrücklich vermieden, die Vereinheitlichung höherer Ordnung in meiner Antwort zu erwähnen, da höhere Arten es nicht erfordern. Die obige Vereinheitlichungsregel soll auch nicht einen vollständigen Algorithmus liefern, sondern nur einen Schritt ("Ein typischer Schritt im Vereinheitlichungsalgorithmus ist ..."). Ich werde versuchen, diese Punkte klarzustellen, um Verwirrung zu vermeiden. – chi
Nun, im Allgemeinen erfordern höhere Arten eine Vereinigung höherer Ordnung. Die Antwort sollte also wahrscheinlich klären, welche Einschränkungen Sie in der Sprache erwarten. –