Was sind die Hauptunterschiede zwischen Zeilenpolymorphismus und Subtypisierung?

20

Ich höre oft, dass Zeilenpolymorphismus ein besserer Ansatz ist als Subtypisierung, aber ich habe Schwierigkeiten, irgendetwas zu finden, das sie im Detail vergleicht. Mich interessiert vor allem die Perspektive eines Anwenders des Systems.

Ich bin auf diesen Blog-Beitrag gestoßen, habe aber mehr Fragen als zuvor. Beispielsweise wird behauptet, ein System mit Untertypisierung würde einen Typ zuweisen, während ein System mit Zeilentypisierung einen anderen Typ zuweisen würde. Bedeutet das, dass ein System, das angeblich Subtyping hat, den Typ "Zeilentyping" zuweist, dies falsch angibt?

Der einzige wesentliche Unterschied, den ich sehe, besteht darin, dass die Zeilentypisierung das Ausrichten der Argumenttypen ermöglicht (das heißt, Sie schreiben eine Funktion mit zwei Argumenten, die sich nur mit dem aFeld ihrer Argumente befasst, aber voraussetzt, dass ihre Argumente dieselben Felder haben). .

Alex R
quelle

Antworten:

10

Subtyping sagt, wenn ein Ausdruck eines Typs gegeben ist, können wir ihm auch einen anderen Typ geben. Wir sagen, das erstere ist ein Subtyp des letzteren und diese Subtyp-Beziehung induziert viele andere Beziehungen. In Symbolen ist

ΓE:SS<:TΓE:T

Der Schlüssel hier (und der Grund, warum ich es überprüft habe) ist, dass der gleiche Ausdruck zwei verschiedene Typen hat. In parametrisch polymorphen Sprachen mit impliziter Typinstanziierung haben wir die folgende Subtypisierungsbeziehung: (α.τ)<:τ[T/α]T

{1:A,2:B}<:{2:B,1:A}{1:EIN,2:B}{2:B,1:EIN}STS<:TT<:S{1:EIN,2:B}={2:B,1:EIN}T<:T

Normalerweise , wenn wir über eine Sprache sprechen , mit Subtypisierung wir meinen eine mit einem nicht-triviale Subtyping Beziehung auf Bodentypen, dh Typen ohne freie Variablen (die, natürlich, kann und wird Subtypisierung Beziehungen für Nicht-Boden - Typen erzeugen). Ein System mit Zeilenpolymorphismus wie Roys ist also keine Sprache mit Subtypisierung in diesem Sinne, obwohl es die nicht-triviale Subtyp-Beziehung hat, die aus einer implizit instanziierten parametrischen polymorphen Sprache stammt. Bei der strukturellen Untertypisierung werden nicht-triviale Untertypisierungsbeziehungen für Bodentypen explizit angegeben.

()oben impliziert die strukturelle Untertypisierung Zeilentypen, aber nicht umgekehrt. Der parametrische Polymorphismus ist orthogonal zu Zeilentypen oder strukturellen Untertypen. Ein System mit struktureller Untertypisierung + parametrischem Polymorphismus subsumiert den Zeilentyp + parametrischen Polymorphismus (unter der Annahme einer Art "Datensatzvereinigung") in dem Sinne, dass jeder Ausdruck in letzterem mit demselben Typ in ersteren typisiert werden kann. Ersterer kann nur mit weiteren Typen tippen. Brians Beispiel Verwendung in einem System mit strukturellen Subtyping und parametrischer Polymorphismus answerhätte den gleichen Typ wie in der Reihe der Eingabe - Version, aber es hätte auch den Typ der Subtyping Version als auch .

ρ{ c : Number }information: Beim Übergang von einem Untertyp zu einem Supertyp gehen (Typ-) Informationen verloren. Dies kann oft das sein, was Sie wollen: Es gibt einen gemeinsamen Typ, den Sie interessieren, und alles andere sind irrelevante Details. Meine Neigung besteht darin, so viele Typinformationen wie möglich beizubehalten und sie nur explizit zu verwerfen. Die Nachteile des Ansatzes von Subtyping werden oft durch Programme deutlich, die typrichtig sind, aber nur, weil Typen auf einen (n informationslosen) "oberen" Typ verschoben wurden, z. B. den leeren Datensatz. Wiederholender, parametrischer Polymorphismus bewahrt (im Allgemeinen) Typinformationen, Subtypisierung verliert sie absichtlich.

Derek Elkins
quelle
Vielen Dank für die ausführliche Antwort! Eine andere Frage: Wenn die strukturelle Untertypisierung + der parametrische Polymorphismus die Zeilentypisierung + den parametrischen Polymorphismus subsumiert, warum würden Sie jemals den letzteren verwenden?
Alex R
@AlexR Wie Brian in seinem Blog-Beitrag erwähnt hat, interagiert die Subtypisierung extrem schlecht mit der Typinferenz und vielen anderen Aspekten, wie dem von mir erwähnten ergonomischen Problem. Es gibt auch Implementierungs- und Sprachkomplexitätsprobleme. Um fair zu sein, gibt es einen breiten Gestaltungsspielraum sowohl für "Zeilentypen" als auch für Subtypen. Die "Subsummen" sind also eine grobe Aussage.
Derek Elkins