Hmm ... Bu tanım uzun zaman önce gördüğüm bazı haskell örneğine çok benziyor.
{-# 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]
Yapıcı X
uygulandığında ∀ aslında ∃ olur. Çıkardığınızda value
, türü bilmediğinizi ve üzerinde boş bir işlem kümesinin olduğunu unutmayın. Ama onunla viewValue
uyumlu olduğu için value
ona uygulanabilir.
Sanırım interface
önerdiğiniz Java'nın temel farkı, sonucu geçmek için ara türü bilmeniz op₁
gerektiğidir op₂
. Varoluşçu tip için uygun sistem, koşullara göre var olması garanti edilen doğru tipi seçmelidir. Yani sen türüyle işlevi yazmak gerekir: ∀X. X→(X→boolean)→T
. Önceki örnekte böyle bir işlev kullanılan X
yapıcıdır X 3 show
( show
uygulayan Show
ve döndüren herhangi bir türün argümanını alan işlevdir String
)
Güncellendi: Sorunuzu tekrar okudum ve Java için uygun bir yapım olduğunu düşünüyorum:
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₂()) ...
Bahsetmek konusunda haklısınız this
- aslında sizin op₁unuz.
Şimdi klasik OOP dillerinin (Java, C #, C ++ vb.) Her zaman tek bir değere sahip varoluşsal türü this
ve bu değerle örtük olarak adlandırılan "yöntemler" adı verilen bir işlevi uyguladığını anladım :)
PS Maalesef Java'ya pek aşina değilim ama umarım bu fikre sahipsiniz.