2015-01-29 20 views
5

यह शायद एक बहुत ही बुनियादी सवाल है, लेकिन, फिर भी, ऐसा लगता है कि यह SO पर शामिल नहीं है।हास्केल- (घोषणा का प्रकार) "ए" क्या है?

मैं हाल ही में हास्केल लिया और अब तक टाइप घोषणाओं शामिल ज्यादातर निम्नलिखित:

Int 
Bool 
Float 
etc, etc 

अब मैं सूचियों में हो रही है और मैं इस तरह के निम्नलिखित समारोह में के रूप में प्रकार घोषणाओं कि a उपयोग करते हैं, देख रहा हूँ कि एक साहचर्य सूची के माध्यम से दोहराता:

contains :: Int -> [(Int,a)] -> [a] 
contains x list = [values | (key,values)<-list, x==key] 

कोई क्या इस a है के रूप में एक विवरण प्रदान कर सकते हैं, और यह कैसे काम करता है? अवलोकन से यह हर प्रकार का प्रतिनिधित्व करता प्रतीत होता है। क्या इसका मतलब है कि मैं किसी भी प्रकार की किसी भी सूची को पैरामीटर के रूप में इनपुट कर सकता हूं?

उत्तर

12

हां, आप सही हैं, यह "किसी भी प्रकार" का प्रतिनिधित्व करता है - प्रतिबंध यह है कि किसी दिए गए प्रकार के हस्ताक्षर में सभी a एस उसी प्रकार को हल करना चाहिए। तो आप किसी भी प्रकार की सूची इनपुट कर सकते हैं, लेकिन जब आप सूची में मूल्य देखने के लिए contains का उपयोग करते हैं, तो आपके द्वारा देखे जाने वाले मान को सूची के तत्वों के समान ही होना चाहिए - जो निश्चित रूप से समझ में आता है।

+8

बस महत्वपूर्ण रूप से, 'ए' विशेष नहीं है: * किसी भी * लोअर-केस पहचानकर्ता का अर्थ है। यह एक प्रकार * परिवर्तनीय * है, और एक ही हस्ताक्षर में मौजूद कई अलग-अलग प्रकार चर के लिए यह संभव है। उदाहरण के लिए, 'const :: a -> b -> a' दो तर्कों में से प्रत्येक में से प्रत्येक प्रकार लेता है, और उसी प्रकार के साथ एक मान देता है जो इसके पहले इनपुट के रूप में होता है। – amalloy

+2

मैं देखता हूं, यह बहुत सामान्य है। तो, मुझे लगता है कि, ज्यादातर मामलों में, 'ए' आम तौर पर उन तत्वों का प्रतिनिधित्व करेगा जो मेरा फ़ंक्शन वास्तव में उपयोग नहीं करता है, या बहुत अधिक परिवर्तन नहीं करता है। – Bolboa

+1

@ बोल्बो: हां, यह अन्य भाषाओं में "जेनेरिक" की अवधारणा से निकटता से संबंधित है। और हां, यदि प्रकार पूरी तरह से सामान्य है, तो आप मूल्य के लिए सीधे कुछ भी कर सकते हैं। हास्केल के पास इस प्रकार के बारे में अधिक जानकारी देने का एक तरीका है (उदाहरण के लिए, "समानता के लिए तुलना की जा सकती है", "मुद्रित किया जा सकता है", "किसी संख्या की तरह व्यवहार किया जा सकता है"), जो आपको मूल्यों पर अधिक प्रसंस्करण करने की अनुमति देता है ; यदि आप इसमें रूचि रखते हैं तो दस्तावेज़ों या ट्यूटोरियल में "कक्षाएं" देखें। – psmears

1

हास्केल में, अपरकेस प्रकार ठोस प्रकार (Int, Bool) या प्रकार कंस्ट्रक्टर्स (Maybe, Either), जबकि लोअरकेस प्रकार प्रकार चर कर रहे हैं। एक समारोह सभी प्रकार के चर का उपयोग करता है में परोक्ष सामान्य है, इसलिए इस:

contains :: forall a. Int -> [(Int, a)] -> [a] 

सी ++ में, forall वर्तनी है template:

template<typename a> 
list<a> contains(int, list<pair<int, a>>); 

contains :: Int -> [(Int, a)] -> [a] 

इस * के लिए आशुलिपि है

जावा और सी # में, यह कोण ब्रैकेट के साथ वर्तनी है:

list<a> contains<a>(int, list<pair<int, a>>); 

बेशक, इन भाषाओं में, सामान्य प्रकार चर अक्सर कहा जाता है T, U, V, जबकि हास्केल में वे अक्सर a, b, c कहा जाता है। यह सिर्फ सम्मेलन का एक अंतर है।

* यह वाक्यविन्यास जीएचसी में -XExplicitForAll ध्वज के साथ-साथ अन्य एक्सटेंशन द्वारा भी सक्षम है।

+0

अधिक उपयोगी: '-XScopedTypeVariables'। इसके अलावा, सी ++ टेम्पलेट्स हस्सेल/एमएल/... प्रकार चर या यहां तक ​​कि जावा जेनरिक से भी अलग हैं। – dfeuer

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