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 X
angewendet wird, wird ∀ tatsächlich zu ∃. Beachten Sie, dass value
Sie beim Herausnehmen den Typ nicht kennen und einen leeren Satz von Operationen darüber haben. Aber da viewValue
es irgendwie kohärent ist value
, 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 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 X
Konstruktor verwendet X 3 show
( show
ist eine Funktion, die Argumente eines beliebigen Typs akzeptiert, der implementiert Show
und 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 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.