क्या हास्केल में मिटाए गए प्रकार हैं?


13

हास्केल में "जेनेरिक कार्यों" की धारणा है, जिसमें आम लिस्प के साथ कुछ स्पष्ट समानता है-हास्केल के साथ न तो सामान्य लिस्प के साथ अनुभव है, न ही मैं यहां बहुत अनुमानित हो सकता है। इसका मतलब है कि to_stringसभी प्रकारों के लिए एक स्ट्रिंग प्रतिनिधित्व को परिभाषित करने के लिए एक सामान्य सुविधा को परिभाषित किया जा सकता है । बेशक, सुविधा को विशेष मामलों में परिभाषित किया जाना है, लेकिन एक to_stringफ़ंक्शन है जिसका हस्ताक्षर है α → string

क्या प्रकार हास्केल में मिटा दिए गए हैं, क्योंकि वे ओकेमेल में हैं? यदि हाँ, तो हास्केल में "जेनेरिक फ़ंक्शंस" का क्रियान्वयन आम लिस्प से कैसे भिन्न है, जहाँ प्रकार गतिशील हैं, और इस प्रकार मिटाए नहीं जाते हैं?

मैं समझता हूं कि कार्यान्वयन विवरण संकलक विशिष्ट हैं, लेकिन संभवतः कई या सभी कार्यान्वयन के लिए प्रावधान सामान्य हैं।


5
याद रखें कि आप शायद गैर-तुच्छ प्रकार के कार्य को परिभाषित नहीं कर सकते हैं a -> String। आपको अधिक संभावना है कि एक प्रकार की बाधा होगी, जैसे Show a => a -> String
डीजेजी

जवाबों:


16

अब तक का जवाब भ्रामक है।

"पैरामीट्रिक" और "एड-हॉक ओवरलोडिंग" बहुरूपता के बीच अंतर करने की आवश्यकता है। पैरामीट्रिक का अर्थ है "सभी प्रकार के लिए समान रूप से व्यवहार करता है", जबकि "एड-हॉक" - साइमन को बहुरूपता के रूप में संदर्भित करता है - प्रकार के आधार पर कार्यान्वयन में परिवर्तन।

दोनों के उदाहरण हैं reverse :: [a] -> [a], जो पैरामीट्रिक है, और show :: Show a => a -> Stringजो "एड-हॉक" ओवरलोडेड है।

यदि आप एक अमूर्त अंतर्ज्ञान चाहते हैं, तो मुझे लगता है कि यह प्राकृतिक भाषा की कक्षाओं पर विचार करने में मदद करता है जो सभी वस्तुओं के लिए 'काम' करते हैं, जैसे "खुद के लिए" या "सोचने के लिए" जो कि वस्तु पर कोई बाधा नहीं डालता है, लेकिन " खोलने के लिए "जो हम बात कर रहे हैं उसे खोलने की आवश्यकता है। मैं 'एक दरवाजे के बारे में सोच सकता हूं', और 'एक दरवाजा खोलो', जबकि इसका कोई मतलब नहीं है जैसे 'एक पेड़ खोलना'। उदाहरण को और आगे ले जाने के लिए "ओपन करना" "एड-हॉक पॉलिमॉर्फिक" के रूप में "एक विंडो खोलने के लिए" और "ग्राहक सेवा के साथ एक शिकायत-टिकट खोलने के लिए" दो बहुत अलग चीजें हैं। अगर यह मजबूर लगता है - इसे भूल जाओ! इससे मेरा काम बनता है।

दोनों को संकलन-समय पर हल किया जाता है, हालांकि, और वास्तव में "मिट" जाता है। मोडुलो विभिन्न जीएचसी एक्सटेंशन और टेम्पलेट हास्केल, आदि प्रकार वास्तव में संकलन समय पर मिटाए जाते हैं और रन-टाइम पर कभी भी निरीक्षण नहीं किया जाता है।

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

कार्यान्वयन एसपीजे की पाठ्यपुस्तक और वैडलर और ब्लॉट्स पेपर पर टाइप-कक्षाओं में विस्तृत है ।


क्या आपको लगता है कि मुझे अपना उत्तर हटा देना चाहिए?
साइमन बर्गोट

नहीं, यह सटीक शब्दावली न रखने की आपकी चेतावनी के साथ ठीक है
क्रिस

क्या आप थोड़ा विस्तार कर सकते हैं कि जीएचसी के लिए प्रकारों को मिटाना क्यों संभव है? क्या यह प्रिंसिपल टाइपिंग के लिए धन्यवाद है?
साइमन बर्गोट

2
सामान्य तौर पर रनटाइम में या तो पैरामीट्रिक पॉलीमॉर्फिक फ़ंक्शन केवल एक बार मौजूद हो सकते हैं और एड-हॉक पॉलीमॉर्फिक फ़ंक्शन को कुछ वर्चुअल प्रेषण विधि के माध्यम से कॉल कर सकते हैं या प्रत्येक प्रकार के लिए सभी कोड अलग-अलग उत्पन्न हो सकते हैं और स्टेटिकली लिंक को कॉल कर सकते हैं। या तो कार्यान्वयन भाषा के दृष्टिकोण से सही है (ध्यान दें, कि हास्केल में बहुरूपिक प्रकार नहीं है; ऐसी चीज केवल जीएचसी forallविस्तार के साथ बनाई जा सकती है )।
जनवरी को हूडेक

क्या कोई GHC एक्सटेंशन है जो प्रकारों को मिटाने की अनुमति नहीं देता है? ओवरलोडिंग स्थिर है और पूर्ण निर्भर प्रकारों के बिना मैं कुछ भी नहीं सोच सकता
डैनियल ग्रैज़र

1

चेतावनी: सीएस में मेरी पृष्ठभूमि बहुत मजबूत नहीं है, इसलिए मैं हमेशा सही शब्दावली का उपयोग नहीं कर सकता हूं, और मैं कुछ बिंदुओं पर गलत हो सकता हूं। वैसे भी, यहाँ मेरी समझ है:

मुझे लगता है कि आप बहुरूपता के साथ सामान्यता को भ्रमित कर रहे हैं।

जेनेरिक प्रकार जैसे कि List<Foo>उन प्रकारों का वर्णन करने के लिए उपयोग किया जाता है जो अन्य प्रकारों को पैरामीटर के रूप में लेते हैं, और अमीर प्रकार की जांच की अनुमति देते हैं।

हैस्केल में एक सामान्य कार्य हो सकता है count:: List a -> Int। यह किसी भी प्रकार की सूचियों को स्वीकार करता है, और तत्वों की संख्या लौटाता है। केवल एक कार्यान्वयन है।

आमतौर पर, जब सूची को परिभाषित करते हैं, तो आप टी के बारे में कुछ भी नहीं मान सकते हैं। आप केवल इसे स्टोर कर सकते हैं और इसे वापस दे सकते हैं।

आपका to_stringफ़ंक्शन एक बहुरूपी फ़ंक्शन है, जिसका अर्थ है कि यह अलग-अलग परिस्थितियों में अलग-अलग व्यवहार करेगा। हैस्केल में, यह टाइपसेकल्स के साथ किया जाता है, जो प्रकारों के लिए विशेषण की तरह काम करता है।

आपके पास एक Showटाइपकास्ट है, जो एक show :: a -> Stringफ़ंक्शन को परिभाषित करता है ।

जब कोई टाइप टाइपकॉल Fooलागू करता है Show, तो उसे इसकी परिभाषा प्रदान करनी चाहिए show। इस प्रकार का उपयोग तब Showक्वालीफायर (जैसे Show a => a -> whatever) की आवश्यकता वाले कार्यों में किया जा सकता है । हास्केल प्रकारों को मिटा नहीं सकते हैं, क्योंकि उन कार्यों को फ़ंक्शन के सही कार्यान्वयन का पता लगाना है show


आम लिस्प में, बहुरूपी कार्यों को "जेनेरिक फ़ंक्शंस" IIRC कहा जाता है और मैंने उसी (भ्रामक) शब्दावली का इस्तेमाल किया है। आपका उत्तर उपयोगी है और आपका अंतिम तर्क बहुत ही ठोस है। .-)
user40989

"केवल एक कार्यान्वयन है" - केवल एक जो समझ में आता है, निश्चित है, लेकिन असीम रूप से कई संभव हैं। A → b has प्रकार का एक फंक्शन | b | ^ | a | संभव कार्यान्वयन (प्रकार बूल → बूल के कार्यों की संख्या पर विचार करें), और सूचियों की कोई ऊपरी आकार सीमा नहीं है।
जॉन पूर्डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.