Hmm ... Diese Definition sieht einem Haskell-Beispiel sehr ähnlich, das ich vor langer Zeit gesehen habe.
{-# LANGUAGE ExistentialQuantification #-}
data X = forall a . X { value :: a, viewValue :: a -> String }
instance Show X where show (X { value = x, viewValue = f}) = f x
sample :: [X]
sample = [X 3 show, X "abc" show, X 3.14 show]
Wenn der Konstruktor Xangewendet wird, wird ∀ tatsächlich zu ∃. Beachten Sie, dass valueSie beim Herausnehmen den Typ nicht kennen und einen leeren Satz von Operationen darüber haben. Aber da viewValuees irgendwie kohärent ist value, kann es darauf angewendet werden.
Ich denke, der Hauptunterschied von Java, den interfaceSie vorgeschlagen haben, ist die Tatsache, dass Sie den Zwischentyp kennen müssen, um das Ergebnis von an op₁zu übergeben op₂. 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 als XKonstruktor verwendet X 3 show( showist eine Funktion, die Argumente eines beliebigen Typs akzeptiert, der implementiert Showund zurückgibt String).
Aktualisiert: Ich habe Ihre Frage gerade noch einmal gelesen und denke, ich habe die richtige Konstruktion für Java:
interface T {
boolean op₂();
}
...
T x = new T() {
private final int op₁ = ...;
public boolean op₂() { return ((op₁ % 2) == 0); }
};
T y = new T() {
private final char op₁ = ...;
public boolean op₂() { return ('0' <= op₁ && op₁ <= '9'); }
};
if (x.op₂() && y.op₂()) ...
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 thisund 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.