Хм ... Это определение выглядит очень похоже на пример с 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, но надеюсь, у вас есть идея.