Hmm ... Quella definizione sembra molto simile ad un campione 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 viene applicato il costruttore X
∀ diventa effettivamente ∃. Si noti che quando si estrae value
non si conosce il tipo e si ha un set vuoto di operazioni su di esso. Ma poiché viewValue
è un po 'coerente con value
può essere applicato ad esso.
Immagino che la principale differenza di %% di Java proposta sia il fatto che devi conoscere il tipo intermedio per passare il risultato di interface
a op₁
. Cioè sistema corretto per tipo esistenziale dovrebbe selezionare il tipo giusto che è garantito per condizione. Cioè dovresti essere in grado di scrivere la funzione con tipo: op₂
. Nel campione precedente tale funzione è ∀X. X→(X→boolean)→T
costruttore utilizzato in X
( X 3 show
è una funzione che prende l'argomento di qualsiasi tipo che implementa show
e restituisce Show
)
Aggiornato: ho appena riletto la tua domanda e penso di avere una corretta costruzione 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 nel menzionare String
- in realtà è il tuo caso.
Quindi immagino di aver capito ora che i linguaggi OOP classici (Java, C #, C ++ ecc.) implementano sempre il tipo esistenziale con valore singolo this
e una funzione su di esso chiamata "metodi" che implicitamente chiamata con quel valore:)
P.S. Scusa, non ho molta familiarità con Java, ma spero che tu abbia avuto l'idea.