हम्म ... यह परिभाषा बहुत हद तक कुछ हस्केल नमूने के समान है जो मैंने बहुत समय पहले देखी है।
{-# 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
और इसके ऊपर एक फ़ंक्शन "विधियाँ" कहलाता है, जो उस मूल्य के साथ कहलाता है :)
क्षमा करें, मैं जावा से बहुत परिचित नहीं हूं, लेकिन मुझे आशा है कि आपको विचार मिल गया होगा।