Angesichts des existenziellen Typs
T = ∃X.{op₁:X, op₂:X→boolean}
und diese generische Java-Schnittstelle:
interface T<X> {
X op₁();
boolean op₂(X something);
}
Was sind die grundlegenden Unterschiede zwischen dem existenziellen Typ und der Java-Schnittstelle?
Offensichtlich gibt es syntaktische Unterschiede und die Objektorientierung von Java (die auch Details wie versteckte this
Parameter usw. enthält). Diese interessieren mich weniger als vielmehr konzeptionelle und semantische Unterschiede. Wenn jedoch jemand einige Feinheiten (wie den Unterschied in der Notation zwischen T
vs. T<X>
) beleuchten möchte, wäre dies ebenfalls wünschenswert.
java
interfaces
type-systems
stakx
quelle
quelle
Antworten:
Hmm ... Diese Definition sieht einem Haskell-Beispiel sehr ähnlich, das ich vor langer Zeit gesehen habe.
Wenn der Konstruktor
X
angewendet wird, wird ∀ tatsächlich zu ∃. Beachten Sie, dassvalue
Sie beim Herausnehmen den Typ nicht kennen und einen leeren Satz von Operationen darüber haben. Aber daviewValue
es irgendwie kohärent istvalue
, kann es darauf angewendet werden.Ich denke, der Hauptunterschied von Java, den
interface
Sie vorgeschlagen haben, ist die Tatsache, dass Sie den Zwischentyp kennen müssen, um das Ergebnis von anop₁
zu übergebenop₂
. Das richtige System für den existenziellen Typ sollte den richtigen Typ auswählen, der durch die Bedingung garantiert existiert. Dh Sie sollten in der Lage sein, Funktion mit Typ zu schreiben :∀X. X→(X→boolean)→T
. Im vorherigen Beispiel wird eine solche Funktion alsX
Konstruktor verwendetX 3 show
(show
ist eine Funktion, die Argumente eines beliebigen Typs akzeptiert, der implementiertShow
und zurückgibtString
).Aktualisiert: Ich habe Ihre Frage gerade noch einmal gelesen und denke, ich habe die richtige Konstruktion für Java:
Sie haben Recht mit der Erwähnung
this
- es ist eigentlich Ihre Meinung.Ich glaube, ich habe jetzt verstanden, dass klassische OOP-Sprachen (Java, C #, C ++ usw.) immer einen existenziellen Typ mit einem einzelnen Wert
this
und einer Funktion darüber implementieren , die "Methoden" genannt wird und implizit mit diesem Wert aufgerufen wird :)PS Entschuldigung, ich bin mit Java nicht sehr vertraut, aber ich hoffe, Sie haben die Idee.
quelle
Der einzige Unterschied besteht darin, dass die Java-Schnittstelle dem Java-Compiler tatsächlich etwas bedeutet.
Der existenzielle Typ ist die formale Definition eines Typs, der für keine Sprache spezifisch ist. Informatiker verwenden diese Art der Definition, um Dinge über den Typ und über die Sprachen, die ihn implementieren, zu beweisen. Die Java-Schnittstelle ist eine der Java-Implementierungen des formal definierten Typs.
quelle
Die 2 vorgestellten Typen unterscheiden sich stark voneinander. Die von Ihnen geschriebene Schnittstellendefinition ist ein universeller Typ (Java-Generika fallen im Allgemeinen in diese Kategorie).
Ein existenzieller Typ verbirgt einen Typ innerhalb seiner Implementierung vor dem Verbraucher. Damit X in T existenziell ist, kann die Identität von X intuitiv keinem Verbraucher bekannt sein. Alles, was bekannt sein sollte, ist die Menge der Operationen, die bei der Definition bereitgestellt werden. Es gibt einen Typ T für einen Typ X.
Im Gegensatz dazu definiert ein universeller Typ Operationen, die für alle Typen gelten und aus denen der Verbraucher frei wählen kann. Der Schnittstellentyp T ist genau das. X wird vom Verbraucher instanziiert, der genau weiß, um welchen Typ X es sich handelt. Für jeden Typ X im Universum gibt es einen Typ T.
Existentials sind in Java als Sprachkonstrukt nicht vorhanden, außer im begrenzten Fall von Platzhaltern (
List<?>
). Aber ja, sie können mit Schnittstellen emuliert werden. Das Problem wird dann mehr vom Design.Wie nur erwähnt, ist es in einer objektorientierten Umgebung schwierig, Existentials zu implementieren, da die Art und Weise, wie Sie normalerweise die Typinformationen von X codieren (was Sie damit tun können), darin besteht, Elementfunktionen in einem Schnittstellentyp zu haben, den X implementiert. Kurz gesagt, Schnittstellen können einige Typabstraktionsfunktionen erwerben, erfordern jedoch in gewissem Maße die Beseitigung des Existenziellen.
quelle