Hmm ... Cette définition ressemble beaucoup à un échantillon de haskell que j'ai vu il y a longtemps.
{-# 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]
Lorsque le constructeur X
est appliqué, becomes devient en fait ∃. Notez que lorsque vous sortez, value
vous ne connaissez pas le type et avez un ensemble d'opérations vide dessus. Mais comme il viewValue
est un peu cohérent, value
il peut lui être appliqué.
Je suppose que la principale différence de Java que interface
vous avez proposée est le fait que vous devez connaître le type intermédiaire pour passer le résultat de op₁
à op₂
. C'est-à-dire que le système approprié pour le type existentiel doit sélectionner le bon type qui est garanti d'exister par condition. -À- dire , vous devriez être en mesure d'écrire la fonction de type: ∀X. X→(X→boolean)→T
. Dans l'exemple précédent, cette fonction est le X
constructeur utilisé dans X 3 show
( show
est la fonction qui prend l'argument de tout type qui implémente Show
et renvoie String
)
Mise à jour: je viens de relire votre question et je pense que j'ai une bonne construction pour 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₂()) ...
Vous avez raison de mentionner this
- c'est en fait votre op₁.
Donc je suppose que j'ai compris maintenant que les langages OOP classiques (Java, C #, C ++ etc) implémentent toujours un type existentiel avec une valeur unique this
et une fonction dessus appelée "méthodes" qui implicitement appelées avec cette valeur :)
PS Désolé, je ne suis pas très familier avec Java, mais j'espère que vous avez l'idée.