2015-06-04 7 views
5

मुझे आश्चर्य है कि हास्केल के typeclasses को आम लिस्प में अनुकरण करने का कोई तरीका है या नहीं।सामान्य लिस्प में टाइपक्लास

जेनेरिक फ़ंक्शन overloading की अनुमति देते हैं, और deftype का उपयोग करके प्रकारों को परिभाषित करना संभव है (उदाहरण के लिए उदाहरणों की कुछ सूची में सदस्यता द्वारा परिभाषित किया जा सकता है)।

लेकिन मैं एक प्रकार पर dispatch नहीं कर सकता। cons को दोबारा परिभाषित किए बिना sequence वर्ग के उप-वर्ग को cons वर्ग बनाने के बाद कक्षा को किसी अन्य वर्ग के उप-वर्ग (और उप-प्रकार) को बनाने का कोई तरीका है?

धन्यवाद।

+2

असली वास्तविक प्रोग्रामिंग समस्याओं के लिए सबसे अच्छा स्टैक ओवरफ्लो, प्रोग्रामिंग भाषा ए प्रोग्रामिंग भाषा बी की सुविधाओं का समर्थन कर सकता है, तो अटकलों के लिए इतना अच्छा नहीं है ... –

+0

मुझे यहां पोस्ट करने में संकोच नहीं हुआ, सोचा कि यह वास्तव में सिर्फ एक सवाल नहीं था, लेकिन यह भी कैसे एक सुविधा लागू की जा सकती है (जो एक प्रोग्रामिंग चिंता है, नहीं?)। वैसे भी, मैं इसे ध्यान में रखूंगा। –

+0

मैं जानना चाहता हूं कि लिस्प इसे कर सकता है या नहीं। भले ही लिस्प हास्केल की तरह हो, प्रासंगिक नहीं है, भले ही लिस्प टाइपक्लास कर सकता है, एक वैध सवाल है। –

उत्तर

2

हास्केल में टाइप क्लास शब्दकोषों के रूप में "इंटरफेस" के लिए स्थिर रूप से कार्यान्वयन का साधन हैं (इसी प्रकार सी ++ में vtables का उपयोग कैसे किया जाता है, लेकिन लगभग (लगभग) पूरी तरह स्थिर रूप से, सी ++ के विपरीत, जो रनटाइम पर गतिशील प्रेषण करता है)। सामान्य लिस्प हालांकि गतिशील रूप से टाइप की गई भाषा है इसलिए इस तरह के लुकअप का कोई मतलब नहीं होगा। हालांकि आप रनटाइम पर "टाइप क्लास" कार्यान्वयन (उदाहरण) के अपने स्वयं के रूप को लागू कर सकते हैं - सामान्य लिस्प के रूप में अभिव्यक्ति के रूप में एक भाषा में कल्पना करने के लिए एक डिजाइन बहुत मुश्किल नहीं है।

पीएस पाइथन के ज़ोप में एक समान गतिशीलता के साथ एक अनुकूलन तंत्र है, यदि आप एक गतिशील सेटिंग में मौजूदा समाधान का जिक्र करना चाहते हैं।

+0

हास्केल के उदाहरण शब्दकोश सी ++ के vtables से विशेष रूप से अधिक स्थिर नहीं हैं। जब संभव हो तो वे संकलन समय पर विशेषज्ञ होते हैं, लेकिन अन्यथा वे वास्तव में रनटाइम पर पारित होते हैं। – dfeuer

+3

रनटाइम पर पारित किया गया लेकिन कोई गतिशील लुकअप नहीं है क्योंकि कोई गतिशील प्रेषण नहीं है क्योंकि कोई सबटाइप पॉलीमोर्फिज्म उर्फ ​​(प्रकार) विरासत नहीं है - क्या मुझे कुछ याद आया है? –

+1

मुझे यकीन नहीं है। ऐसा लगता है कि शब्दावली थोड़ा अस्पष्ट है। पॉलिमॉर्फिक रिकर्सन (यहां तक ​​कि हास्केल 98 में) या जीएडीटी (असली हास्केल में) की उपस्थिति में, एक विशिष्ट प्रकार को जानकार नहीं किया जा सकता है, और रनटाइम तक एक विशिष्ट उदाहरण मौजूद नहीं हो सकता है। क्या गतिशील प्रेषण का सार नहीं है? – dfeuer

-1

आप जिस तरह से कल्पना करते हैं उसमें कक्षा पदानुक्रम को संशोधित नहीं कर सकते हैं, लेकिन आप बहुत अधिक प्रभाव प्राप्त कर सकते हैं।

मान लीजिए कि एक sequence की अपनी परिभाषा यह समारोह sequence-length के लिए एक विधि है कि है। कि एक नया वर्ग है कि cons शामिल बनाया था

(defmethod sequence-length ((s cons)) 
    (length s)) 

:

(defclass sequence ...) 
(defmethod sequence-length ((s sequence)) ...) 

तो आप आसानी से अपने sequence-length विधि conses का विस्तार कर सकते हैं? ज़रुरी नहीं। (or sequence cons) कहकर आप sequence-length विधि वाली चीजों को व्यक्त कर सकते हैं, लेकिन यह वास्तव में उपयोगी नहीं है।