2013-03-06 16 views
14

Als ich "Typen und Programmiersprachen" gelesen habe, war ich beeindruckt von der Objektimplementierung mit Closures und Subtyping (Kapitel 18). Gibt es einen besonderen Grund, warum OCaml die Subtypisierung von Datensätzen nicht unterstützt (obwohl ich weiß, dass Objekte dies tun)? Tatsächlich kann ich keine Sprache finden, die dies unterstützt.Warum unterstützt OCaml nicht Subtyping?

+1

SML # hat Datensatz Subtyping. OCamls Objekte sind Datensätze mit Subtyping. Strukturelle Subtyping ist mächtig, aber seine Typfehler sind oft kryptisch. Daher bevorzugen OCaml-Benutzer normalerweise einfachere Datensätze ohne Subtyping. – camlspotter

+0

Danke für das Aufzeigen von SML #! Gibt es einen Unterschied zwischen der Datensatz-Subtypisierung in SML # und der Objektstruktur-Typisierung in OCaml? –

Antwort

17

Technisch unterstützen OCaml-Objekte nicht wirklich Subtyping im üblichen Sinne, aber Zeilenpolymorphismus. Es gibt viele Vorteile des Zeilenpolymorphismus gegenüber dem Subtyping, insbesondere sind beide expressiver und arbeiten viel besser mit Typinferenz (Subtyping und Typschlussfolgerung vermischen sich überhaupt nicht gut).

Das Hauptproblem bei der Verwendung von struktureller Subtypisierung oder Zeilenpolymorphie für alle Datensätze ist, dass es eine wesentlich aufwendigere Laufzeitimplementierung erfordert und folglich auch teurer ist. Wo einfache Datensätze trivial in einfache Tupel übersetzt werden können, wobei der Feldzugriff nur Indexierung ist, erfordern strukturelle Subtypisierung oder Zeilenpolymorphie die Fähigkeit, ein Objekt transparent zu "schneiden", d. H. Es unter einem Supertyp mit entfernten Zufallsfeldern zu betrachten. Im Allgemeinen erfordert dies entweder Feldsuche durch Hashing (z. B. Ocamls Objekte) oder Beweise, die Techniken übergeben, wobei der Index jedes Felds, das von einer Funktion oder einem ihrer Callees verwendet wird, zusätzlich zu einem versteckten Argument übergeben werden muss der tatsächliche Datensatz (das ist zum Beispiel, was SML # macht).

In jedem Fall Ocaml hat polymorphe Datensätze, sie sind nur Objekte genannt. Aber Sie können die ganze Klasse um sie herum ignorieren, wenn Sie sie nicht brauchen.

+1

Ja, die Klasse Chaos war was mich abschrecken. Ich bin neu bei OCaml, aber ich freue mich darauf, mehr über sein Objektsystem zu erfahren. Wie auch immer, danke für deine Antwort! –

8

Datensatz Subtyping ist ziemlich gefährlich auf einer Schreibweise Sicht.

Nehmen wir an, Sie haben einen Datensatz mit drei Feldern: a, b und c. Und Sie möchten einen Datensatz mit nur zwei Feldern erstellen: a und c. Der Compiler weiß nicht, welchen Typ Sie verwenden, bis er den ganzen Datensatz gelesen hat, und am Ende kann er Ihnen nicht helfen, wenn Sie einen Fehler gemacht haben: Sie haben beispielsweise das Feld b vergessen. Ich stimme völlig zu, dass diese Sichtweise anfechtbar ist, aber ich denke, so denken Leute, die Ocaml schreiben.

+0

Vielen Dank für den Hinweis. Ich würde upvote, aber mein Ruf ist zu niedrig;) –

+1

Hmm, verstehe ich nicht ganz. Subtyping bedeutet, dass Sie einen 3-Feld-Datensatz an Orten verwenden können, die einen 2-Feld-Datensatz erwarten. In Ihrem Beispiel erstellen Sie jedoch (möglicherweise versehentlich) einen Datensatz mit zwei Feldern. Selbst mit dem Subtyping würde der Compiler es erlauben, sie nur an Stellen zu verwenden, die tatsächlich 2 Felder (oder weniger) erwarten. Aber das ist in Ordnung, denn diese Orte werden niemals Ihr drittes Feld sehen. – max