Хм ... Это определение выглядит очень похоже на пример с 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- это на самом деле ваша работа.
Так что теперь я понял, что классические языки ООП (Java, C #, C ++ и т. Д.) Всегда реализуют экзистенциальный тип с одним значением thisи над ним функции, называемые «методами», которые неявно вызываются с этим значением :)
PS Извините, я не очень знаком с Java, но надеюсь, у вас есть идея.