Hmm ... Quella definizione sembra molto simile a qualche esempio di haskell che ho visto molto tempo fa.
{-# 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]
Quando X
si applica il costruttore ∀ diventa effettivamente ∃. Si noti che quando si estrae value
non si conosce il tipo e si dispone di un set di operazioni vuoto su di esso. Ma poiché viewValue
è un po 'coerente con value
esso può essere applicato ad esso.
Immagino che la principale differenza di Java che interface
hai proposto sia il fatto che devi conoscere il tipo intermedio per passare il risultato di op₁
a op₂
. Cioè il sistema adeguato per il tipo esistenziale dovrebbe selezionare il tipo giusto che è garantito per esistere dalla condizione. Per esempio, si dovrebbe essere in grado di scrivere la funzione con il tipo: ∀X. X→(X→boolean)→T
. Nel campione precedente tale funzione è X
utilizzata dal costruttore X 3 show
( show
è la funzione che accetta argomenti di qualsiasi tipo che implementa Show
e restituisce String
)
Aggiornato: ho appena riletto la tua domanda e penso di avere una costruzione adeguata per 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₂()) ...
Hai ragione a menzionare this
- in realtà è la tua opera.
Quindi immagino di aver capito ora che i linguaggi OOP classici (Java, C #, C ++ ecc.) Implementano sempre un tipo esistenziale con un singolo valore this
e una funzione su di esso chiamata "metodi" che implicitamente chiamava con quel valore :)
PS Siamo spiacenti, non ho molta familiarità con Java, ma spero che tu abbia avuto l'idea.