うーん...その定義は、私がずっと前に見たいくつかの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
が適用されると、実際にはbecomesになります。取り出すvalue
ときは、タイプがわからず、空の操作セットがあることに注意してください。しかし、それviewValue
とは首尾一貫しvalue
ているので、それに適用することができます。
interface
あなたが提案したJavaの主な違いは、op₁
toの結果を渡すための中間型を知っている必要があるという事実だと思いますop₂
。つまり、実存型の適切なシステムは、条件によって存在することが保証されている適切な型を選択する必要があります。つまり、次のタイプの関数を作成できるはずです∀X. X→(X→boolean)→T
。prevサンプルでは、このような関数は、で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
-それは実際にはあなたの操作です。
だから、古典的なOOP言語(Java、C#、C ++など)は常に単一の値this
とその値で暗黙的に呼び出される「メソッド」と呼ばれるその上の関数で実在型を実装することを理解したと思います:)
PS申し訳ありませんが、私はJavaにあまり精通していませんが、あなたがアイデアを持っていることを願っています。