Hmm ... Ta definicja wygląda bardzo podobnie do próbki Haskell, którą widziałem dawno temu.
{-# 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]
Po Xzastosowaniu konstruktora ∀ faktycznie staje się ∃. Zauważ, że kiedy wyjmujesz, valuenie znasz typu i masz nad nim pusty zestaw operacji. Ale ponieważ viewValuejest to w pewnym sensie spójne value, można do niego zastosować.
Myślę, że główną różnicą w Javie, interfacektórą zaproponowałeś, jest fakt, że musisz znać typ pośredni, aby przekazać wynik op₁do op₂. Tj. Odpowiedni system dla typu egzystencjalnego powinien wybrać odpowiedni typ, który jest gwarantowany przez warunek. Czyli powinien być w stanie napisać funkcję z rodzaju: ∀X. X→(X→boolean)→T. W poprzednim przykładzie taka funkcja jest Xkonstruktorem używanym w X 3 show( showjest funkcją, która pobiera argument dowolnego typu, który implementuje Showi zwraca String)
Zaktualizowano: Właśnie przeczytałem twoje pytanie i myślę, że mam odpowiednią konstrukcję dla 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₂()) ...
Masz rację, wspominając this- to właściwie twój op₁.
Wydaje mi się, że rozumiem teraz, że klasyczne języki OOP (Java, C #, C ++ itp.) Zawsze implementują typ egzystencjalny z pojedynczą wartością thisi nad nim funkcje zwane „metodami”, które domyślnie wywoływane są z tą wartością :)
PS Niestety, nie znam się zbytnio na Javie, ale mam nadzieję, że masz pomysł.