हम्म ... यह परिभाषा बहुत हद तक कुछ हस्केल नमूने के समान है जो मैंने बहुत समय पहले देखी है।
{-# 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लगाया जाता है तो ∀ वास्तव में ∀ बन जाता है। ध्यान दें कि जब आप बाहर निकालते valueहैं तो आप प्रकार नहीं जानते हैं और इस पर ऑपरेशन का खाली सेट है। लेकिन चूंकि viewValueयह थोड़े सुसंगत है, valueइसलिए इसे लागू किया जा सकता है।
मुझे लगता है कि interfaceआपके द्वारा प्रस्तावित जावा के मुख्य अंतर का तथ्य यह है कि आपको परिणाम के गुजरने के लिए मध्यवर्ती प्रकार जानना op₁होगा op₂। अस्तित्व के प्रकार के लिए Ie उचित प्रणाली को सही प्रकार का चयन करना चाहिए जो शर्त के अनुसार मौजूद है। यानी आपको टाइप के साथ फ़ंक्शन लिखने में सक्षम होना चाहिए ∀X. X→(X→boolean)→T:। प्रचलित नमूने में ऐसे फ़ंक्शन का Xउपयोग किया जाता है X 3 show( showफ़ंक्शन है जो किसी भी प्रकार का तर्क लेता है जो लागू होता है Showऔर वापस लौटता है String)
अपडेट किया गया: मैंने अभी आपके प्रश्न को फिर से पढ़ा और मुझे लगता है कि मुझे जावा के लिए उचित निर्माण मिल गया है:
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- यह वास्तव में आपका op right है।
इसलिए मुझे लगता है कि अब मुझे समझ में आया है कि शास्त्रीय OOP भाषाएँ (जावा, C #, C ++ आदि) हमेशा एकल मान के साथ अस्तित्वगत प्रकार को लागू करती हैं thisऔर इसके ऊपर एक फ़ंक्शन "विधियाँ" कहलाता है, जो उस मूल्य के साथ कहलाता है :)
क्षमा करें, मैं जावा से बहुत परिचित नहीं हूं, लेकिन मुझे आशा है कि आपको विचार मिल गया होगा।