2012-11-25 12 views
60

अपनी बात Simple Made Easy में, रिक हिकी ने "पॉलिमॉर्फिज्म ए ला कार्टे" (वीडियो में लगभग 30:00) के बारे में बात की। उसी संदर्भ में, उन्होंने हास्केल के Type Classes और क्लोजर के Multi-Methods (और प्रोटोकॉल) का भी उल्लेख किया है।"पॉलिमॉर्फिज्म ला ला कार्टे" क्या है और मैं इससे कैसे लाभ उठा सकता हूं?

चूंकि मैं इन अवधारणाओं से बहुत परिचित नहीं हूं, इसलिए सादगी प्राप्त करने का प्रयास करते समय मैं इसकी उपयोगिता को समझना चाहता हूं। मैं स्कैला में इस अवधारणा के किसी भी उदाहरण या प्रदर्शन में विशेष रूप से रूचि रखता हूं।

+2

45:37 – Abdull

उत्तर

29

आप मांग पर बहुरूपता एक ला कार्टेके रूप में बहुरूपता ले सकते हैं।

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

  • Prototype-based polymorphism

  • विरासत बहुरूपता

    इस बहुरूपता जावा द्वारा इस्तेमाल किया रणनीति है। क्लोजर प्रॉक्सी द्वारा इसका समर्थन करता है। जावा इंटरऑप करते समय उपयोगी।

  • प्रोटोकॉल

    Clojure के लिए प्रोटोकॉल हास्केल के लिए TypeClass के रूप में है।

  • Multimethod

    जबकि प्रोटोकॉल पहला तर्क के प्रकार के आधार बहुरूपी प्रेषण प्रदान करते हैं मुल्टीमेथड्स और अधिक लचीला तरीका है (किसी भी) तर्कों की किसी भी कार्य के आधार पर प्रेषण कर सकते हैं जो कर रहे हैं।

बहुरूपता एक ला कार्टे का अर्थ है "का चयन करें जो कुछ भी बहुरूपता रणनीति सबसे अच्छा आपके मामले के लिए। वे अपने पिटारे में सभी कर रहे हैं।"

आप implicits का उपयोग कर स्कैला में TypeClass पैटर्न लागू कर सकते हैं। यदि आप असली दुनिया के उदाहरण चाहते हैं तो Scalaz source पढ़ें। स्कैला भाषा स्तर पर बहुआयामी का समर्थन नहीं करता है, लेकिन मुझे लगता है कि आने वाले 2.10 मैक्रो की मदद से यह संभव है।

लाभ के लिए, टाइपलैस और मल्टीमीड जैसे उन्नत बहुरूपता रणनीतियों Expression Problem को हल करने में मदद कर सकते हैं।

"लक्ष्य मौजूदा कोड recompiling के बिना, मामलों, जहां एक डेटाप्रकार और डेटाप्रकार से अधिक नए कार्यों के लिए नए मामलों में जोड़ सकते हैं द्वारा एक डेटाप्रकार परिभाषित करने के लिए है, और स्थिर प्रकार सुरक्षा को बनाए रखते हुए (जैसे, कोई डाले) "।

बीटीडब्ल्यू, यह प्रश्न एक स्टैक ओवरफ्लो प्रश्न में फिट होने के लिए बहुत बड़ा है। मेरा सुझाव इन अवधारणाओं से परिचित होना है, और फिर आप उनकी उपयोगिता को समझेंगे।

+0

से उल्लेख किया गया बहुत छोटा नाइटपिक, लेकिन यदि "प्रोटोकॉल पहले तर्क के प्रकार के आधार पर पॉलीमोर्फिक प्रेषण प्रदान करते हैं", तो वे हास्केल प्रकार कक्षाओं के अनुरूप नहीं हैं। टाइप क्लास उदाहरण किसी भी चीज़ पर "प्रेषण" कर सकते हैं (आप शून्य-तर्क प्रकार के फ़ंक्शन भी एक प्रकार के वर्ग जैसे 'रीड' के उदाहरण में एक मूल्य लौटा सकते हैं, और जिस तरह का रिटर्न वैल्यू * अपेक्षित * निर्धारित किया जाएगा, यह निर्धारित करेगा कि कौन सा उदाहरण प्रयोग किया जाता है)। – Ben

+1

'पढ़ा' निश्चित रूप से एक तर्क लेता है। यह सुनिश्चित नहीं है कि जब मैंने लिखा था कि मेरा दिमाग कहाँ था। 'mempty' एक उदाहरण है जिसका मैं बात कर रहा था। 'read' अपने अपेक्षित रिटर्न प्रकार के आधार पर प्रेषण करता है, हालांकि। – Ben

+0

"* [...] लक्ष्य मामलों द्वारा डेटाटाइप को परिभाषित करना है, जहां डेटाटाइप पर नए मामले और डेटाटाइप पर नए कार्यों को जोड़ सकते हैं [...] *"। ... ** मामले ** के साथ क्या मतलब है? – Abdull

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