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 X
zastosowaniu konstruktora ∀ faktycznie staje się ∃. Zauważ, że kiedy wyjmujesz, value
nie znasz typu i masz nad nim pusty zestaw operacji. Ale ponieważ viewValue
jest to w pewnym sensie spójne value
, można do niego zastosować.
Myślę, że główną różnicą w Javie, interface
któ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 X
konstruktorem używanym w X 3 show
( show
jest funkcją, która pobiera argument dowolnego typu, który implementuje Show
i 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ą this
i 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ł.