2010-06-05 8 views

उत्तर

21

लगता है जैसे only in superficial ways हास्केल में सिंगल पैरामीटर प्रकार कक्षाएं (कन्स्ट्रक्टर क्लास) जैसे इंटरफेस हैं।

  • तरीके एक अंतरफलक प्रकार के साथ जुड़े रहे
  • ऑब्जेक्ट (विशेष प्रकार) है कि इंटरफ़ेस का कार्यान्वयन हो सकता है

यह मेरे लिए स्पष्ट नहीं है कि किसी भी तरह से जाओ इंटरफेस, के माध्यम से घिरे बहुरूपता का समर्थन करता है जो प्रकार वर्गों का प्राथमिक उद्देश्य है। यही कारण है, हास्केल में, इंटरफ़ेस तरीकों विभिन्न प्रकार पर इस्तेमाल किया जा सकता है

class I a where 
    put :: a -> IO() 
    get :: IO a 

instance I Int where 
    ... 

instance I Double where 
    .... 

तो मेरी सवाल यह है कि जाओ टाइप बहुरूपता समर्थन करता है। यदि नहीं, तो वे वास्तव में टाइप क्लास की तरह नहीं हैं। और वे वास्तव में तुलनीय नहीं हैं।

हास्केल के प्रकार के वर्ग "जेनेरिक" के माध्यम से कोड के शक्तिशाली पुन: उपयोग की अनुमति देते हैं - उच्च प्रकार के पॉलीमोर्फिज्म - cross-language support for such forms of generic program is this paper के लिए एक अच्छा संदर्भ।

टाइप कक्षाओं के माध्यम से विज्ञापन, या बाध्य पॉलीमोर्फिज्म well described here है। यह हास्केल में वर्गों का प्रकार का प्राथमिक उद्देश्य है, और गो इंटरफेस के माध्यम से संबोधित नहीं किया गया है, जिसका अर्थ है कि वे वास्तव में बहुत समान नहीं हैं। इंटरफेस सख्ती से कम शक्तिशाली हैं - एक प्रकार का ज़ीरोथ-ऑर्डर टाइप क्लास।

+4

दरअसल, दोनों के बीच एकमात्र संबंध ऐसा लगता है कि दोनों मामलों में "विधियां" "वर्ग" से स्वतंत्र होती हैं। यह इसके बारे में। –

+2

गो के इंटरफेस फ़ंक्शन के हस्ताक्षर में इच्छित इंटरफ़ेस को नाम देने के आधार पर, उस विकिपीडिया लेख द्वारा सख्ती से परिभाषित "बाध्य पॉलीमोर्फिज्म" का समर्थन करते हैं। उदा।, अगर मैं "func foo (a, b IBar)" लिखता हूं, तो संकलक सुनिश्चित करता है कि मैं केवल आईबीआर का समर्थन करने वाले structs में पास कर सकता हूं। हालांकि, हास्केल के टाइपक्लास गैर-संरचना प्रकारों का समर्थन करता है, और यहां तक ​​कि कंपाउंड बाइंडिंग (उदाहरण के लिए, func foo (a, b (IBar && IBaz)) गो में अवैध है, लेकिन (आईबीआर ए, आईबीएज़ ए) => foo :: a -> बी -> ... पूरी तरह से कानूनी है)। कुछ ऐसा करने के लिए आपको गो में एक कंपाउंड इंटरफेस बनाना होगा (vis.io.ioeadCloser)। –

6
  1. हास्केल में typeclass इन्स्टेन्शियशन स्पष्ट है (यानी आप instance Foo Bar कहने के लिए बार फू का एक उदाहरण होने के लिए है), जबकि एक अंतरफलक को लागू करने जाने में निहित है, (यानी जब आप एक वर्ग है कि सही तरीके से परिभाषित करता परिभाषित करते हैं, यह स्वचालित रूप से implement InterfaceName जैसे कुछ कहने के बिना इंटरफ़ेस को लागू करता है)।
  2. एक इंटरफ़ेस केवल उन विधियों का वर्णन कर सकता है जहां इंटरफ़ेस का उदाहरण रिसीवर है। एक टाइपक्लास में तत्काल प्रकार किसी भी तर्क स्थिति या किसी फ़ंक्शन के रिटर्न प्रकार पर दिखाई दे सकता है (यानी आप कह सकते हैं, अगर फू टाइप बार का उदाहरण है, तो बाज़ नामक एक फ़ंक्शन होना चाहिए, जो एक इंट लेता है और एक फू - आप इंटरफेस के साथ नहीं कह सकते हैं)।
+4

बहुरूपता की कमी उस डिग्री को प्रतिबंधित करती है जिस पर गो इंटीफेस टाइप क्लास से संबंधित होते हैं। मैं कहूंगा कि उदाहरण विधियों में बहुरूपता के बिना, वे सतही रूप से अन्य वास्तव में संबंधित नहीं हैं। –

+0

लोग इसके बारे में पूछ रहे हैं कि वे स्पष्ट रूप से संबंधित हैं। मैं कहूंगा कि गो इंटरफेस हास्केल के टाइपक्लास ऑफ़र के सख्त सबसेट हैं। उदाहरण के लिए, गोस्क में जो कुछ भी आप कर सकते हैं वह संभव है हास्केल (त्रिभुज, यहां तक ​​कि), लेकिन रिवर्स सत्य नहीं है। –

5

बहुत सतही समानताएं, गो के इंटरफेस ओकैमल में संरचनात्मक उप-टाइपिंग की तरह अधिक हैं।

6

मैं डॉन स्टीवर्ट के उत्कृष्ट उत्तर में जोड़ूंगा कि हास्केल के प्रकार वर्गों की आश्चर्यजनक शिकायतों में से एक यह है कि आप कक्षा के मनमाने ढंग से कई उदाहरण उत्पन्न करने के लिए संकलन समय पर तर्क प्रोग्रामिंग का उपयोग कर सकते हैं। (हास्केल की टाइप-क्लास सिस्टम में प्रोलॉग का प्रभावी रूप से कट-फ्री सबसेट शामिल है, जो कि डेलिटल के समान ही है।) इस प्रणाली का क्विक चेक लाइब्रेरी में बहुत प्रभावशाली है। या एक बहुत ही सरल उदाहरण के लिए, आप देख सकते हैं कि version of Boolean complement (not) that works on predicates of arbitrary arity को कैसे परिभाषित किया जाए। मुझे संदेह है कि यह क्षमता टाइप-क्लास सिस्टम का एक अनपेक्षित परिणाम था, लेकिन यह अविश्वसनीय रूप से शक्तिशाली साबित हुआ है।

गो के पास ऐसा कुछ भी नहीं है।

3

C++ Concepts (जो इसे C++ 0x में नहीं बनाया गया) हैस्केल प्रकार वर्गों की तरह हैं। वहां "सिद्धांत" भी थे जो हास्केल में मौजूद नहीं हैं। वे आपको मोनैड कानूनों की तरह चीजों को औपचारिक बनाने देते हैं।

संबंधित मुद्दे