(Un-) Vorteile der strukturellen Typisierung

15

Ich habe gerade diesen Vortrag von Daniel Spiewak gesehen, in dem er über die Vorteile der strukturellen Typisierung im Vergleich zur nominalen Typisierung von Scala und Java spricht . Ein Beispiel für diesen Unterschied wäre der folgende Java-Code

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

was natürlich nicht kompiliert werden würde, da die Typkompatibilität zwischen Foound Barnamentlich festgelegt ist.

Andererseits könnte ein Strukturtypsystem erklären, dass beide Typen gleich oder kompatibel sind, und so unter anderem die Eingabe von Enten mit einem Häkchen ermöglichen.

Jetzt denke ich, dass ich die meisten Vorteile eines strukturellen Typensystems verstehe, aber ich frage mich, ob es die Typensicherheit nicht durch Beispiele wie das folgende ungültig machen würde

class Foo {
  class Bar { /* ... */ }
  def takeBar(b: Bar) = { /* ... */ }
  def getBar: Bar = new Bar
}

val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile

Ist mein Verständnis korrekt, dass in einem strukturellen Typensystem auch die letzte Zeile kompiliert wird, und wenn ja, wäre dies kein Nachteil in Bezug auf die Typensicherheit?

Debilski
quelle
3
Können Sie erklären, warum die letzte Zeile nicht kompiliert werden sollte? Ich sehe die Typinkompatibilität nicht.
Sam Goldberg
2
Es ist ein pfadabhängiger Scala -Typ .
Debilski
Eigentlich wollte ich dies aus der Sicht des Scala-Systems diskutieren. Es war einfach so, dass das einzige Beispiel, das in dem Vortrag gegeben wurde, Java war.
Debilski

Antworten:

12

Tatsächlich sind pfadabhängige Typen orthogonal zur strukturellen oder nominalen Typisierung. Es ist nicht wirklich klar, was eine innere Klasse im Kontext einer einfachen strukturell typisierten Sprache bedeutet. Es ist jedoch sehr gut möglich zu definieren . Wenn Sie innere Klassen in einem strukturell typisierten Kontext definieren, müssen Sie sicherstellen, dass Fälle wie der von Ihnen aufgeführte abgelehnt werden (genau aus den gleichen Gründen, aus denen Scala sie ablehnt).

Sie lehnen solche Fälle ab, indem Sie dasselbe tun wie Scala: Modellieren Sie den pfadabhängigen Typ als existenziellen Typ. Das gleiche Pack- / Entpack-Verfahren für den Objektzugriff würde gelten, und die Ergebnisse würden fast identisch mit denen von Scala aussehen. Die Ergebnisse können scheinen wie eine nominelle Art Gleichheit, aber es wäre noch ein Strukturtyp System , da die Frage nach der Art Kompatibilität wird noch auf der Schnittstelle entschieden werden und nicht als Namen.

Die Typisierung von Strukturen hat viele Implikationen, aber (vielleicht überraschend) übertragen sich die meisten Konzepte, die wir alle von nominalen Typsystemen kennen und lieben, auf strukturelle Systeme. Die strukturelle Typisierung ist nichts anderes als eine andere Art, die Typkompatibilität zu definieren.

Daniel Spiewak
quelle
0

Die strukturelle Typisierung erleichtert das Schreiben von generischem Bibliothekscode. Der Hauptgrund, warum das Java-Ökosystem so aufgebläht ist, ist, dass es schwierig ist, kleine Bibliotheken einfach zu schreiben. Wenn Java strukturell getippt wäre, wäre es meiner Meinung nach eine andere Geschichte und eine viel bessere Situation.

Der einzige Nachteil, den ich mir bei der strukturellen Typisierung vorstellen kann, ist das Potenzial für eine langsamere Kompilierung. Ich bin nicht sicher, ob Struktursprachen im Allgemeinen langsamer kompiliert werden als Nominativsprachen oder nicht, aber zum Beispiel ist Golang strukturell typisiert und sehr schnell kompilierbar.

Alexander Mills
quelle