2010-06-28 16 views
6

हास्केल में परिभाषित करने तुम क्यों एक प्रकार बाधा के साथ एक समारोह को परिभाषित करेगा बनाम को समझने के लिए हास्केल के => कोशिश कर रहा है:, प्रकार

ghci> :t (==) 
(==) :: (Eq a) => a -> a -> Bool 

बजाय यह परिभाषित करने तो यह के प्रकार था:

ghci> :t (==) 
(==) :: Eq -> Eq -> Bool 
+0

हेस दो कथन बराबर नहीं हैं –

उत्तर

8

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

आप अपने खुद के प्रकार MyEq को परिभाषित किया था और उसके बाद प्रकार MyEq -> MyEq -> Bool के साथ एक समारोह == को परिभाषित करते हैं, तो अभिव्यक्ति "hello" == "hello" अमान्य होगा क्योंकि "hello" प्रकार स्ट्रिंग के एक मूल्य है और प्रकार MyEq की नहीं। चूंकि हैकेल में कोई सबटाइपिंग नहीं है, इसलिए एक मान स्ट्रिंग प्रकार और MyEq टाइप करने के समान नहीं हो सकता है।

तो अगर आप एक समारोह है कि विभिन्न प्रकार के जो कुछ शर्तों को पूरा के मूल्यों को स्वीकार कर सकते परिभाषित करना चाहते हैं, तो आप प्रकार वर्गों की जरूरत है।

+0

उस पर अनुवर्ती करने के लिए, 'ए :: ईक -> ईक -> बूल चलाने से प्राप्त त्रुटि को देखें; एक बी सी = बी == सी; ghci में 2 2' में। –

+0

धन्यवाद दोस्तों, जो चीजों को सीधा करता है! – sneeu

7

हास्केल में, "प्रकार" में केवल संभावित मानों का एक विशिष्ट सेट हो सकता है जो किसी अन्य प्रकार से ओवरलैप नहीं होता है। ऐसी कोई चीज नहीं है जैसे कि एक प्रकार का "एक अलग प्रकार" या "किसी अन्य प्रकार का उप-प्रकार" हो।

जब हम पॉलिमॉर्फिज्म चाहते हैं, यानी, से अधिक प्रकार के फ़ंक्शन पर लागू हो सकते हैं, तो हम निर्दिष्ट कर सकते हैं कि फ़ंक्शन के हस्ताक्षर प्रकार में एक प्रकार चर का उपयोग करके।

लेकिन एक प्रकार का चर टाइप कर सकता है। हम हमेशा नहीं जानते कि हमारे फ़ंक्शन को बिल्कुल हर प्रकार के लिए कैसे परिभाषित किया जाए। उदाहरण के लिए, (>) फ़ंक्शन केवल उन प्रकारों के लिए समझ में आता है जिनके तत्व तुलनीय हैं। संकलक को फ़ंक्शन लिखने से रोकने में मदद के लिए क्रम में, जिस प्रकार का हस्ताक्षर बहुत सामान्य है, को अस्वीकार कर देगा।

अपने उदाहरण में, Eq एक प्रकार नहीं है। यह टाइपक्लास - प्रकारों के सेट के लिए एक नाम है। हम typeclass class कीवर्ड का उपयोग नाम ऐलान करते हैं और वर्ग instance कीवर्ड का उपयोग में प्रकार जोड़ते हैं। एक टाइपक्लास का उद्देश्य बाधा में को एक प्रकार चर के दायरे को सीमित करने के लिए उपयोग किया जाना है।

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

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

+0

"ओओपी में किस तरह के प्रकारों का उपयोग किया जाता है उससे अलग है", मैं असहमत हूं। हास्केल टाइपक्लास वास्तव में ओओपी में "अमूर्त कक्षाएं" या "इंटरफेस" की तरह हैं, और मुझे संदेह है कि कुछ vtable को रनटाइम प्रेषण के लिए बहुलक फ़ंक्शन के तर्कों के साथ पास किया जाता है। –

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