Гм ... Це визначення дуже схоже на зразок haskell, який я бачив давно.
{-# 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]
При застосуванні конструктора X
∀ фактично стає ∃. Зауважте, що виймаючи, value
ви не знаєте тип і маєте порожній набір операцій над ним. Але оскільки вона viewValue
є якоюсь узгодженою з value
ним, можна застосувати до нього.
Я думаю, що головна відмінність Java, interface
яку ви запропонували, полягає в тому, що ви повинні знати проміжний тип для проходження результату op₁
до op₂
. Тобто належна система для екзистенціального типу повинна вибрати правильний тип, який гарантовано існує за умови. Тобто ви повинні бути в змозі написати функцію з типом: ∀X. X→(X→boolean)→T
. У попередньому зразку така функція X
використовується конструктором X 3 show
( show
це функція, яка бере аргумент будь-якого типу, що реалізує Show
та повертає String
)
Оновлено: Я просто перечитав ваше запитання і, думаю, у мене належна конструкція для 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₂()) ...
Ви маєте рацію згадати this
- це насправді ваша оп₁.
Отже, я думаю, я зрозумів, що класичні мови OOP (Java, C #, C ++ тощо) завжди реалізують екзистенціальний тип з одним значенням this
і функціями над ним, що називаються "методами", які неявно називаються цим значенням :)
PS Вибачте, я не дуже знайомий з Java, але сподіваюся, що у вас виникла ідея.