मैं कुछ हफ्तों के लिए हास्केल सीख रहा हूं, और मेरे पास फ़ंक्शन पैरामीटर के रूप में अंडरस्कोर (_
) के उपयोग के बारे में एक प्रश्न है। मुझे लगता है कि मेरे प्रश्न को एक विशिष्ट उदाहरण से बेहतर तरीके से पूछा जाएगा। आइए मान लें कि मैं एक ऐसे फ़ंक्शन को परिभाषित करना चाहता हूं जो प्रदत्त इंडेक्स-हां के आधार पर सूची के तत्व को निकालता है, मुझे एहसास है कि (!!)
पहले ही परिभाषित है। दो तरह से है कि मैं समारोह को परिभाषित कर सकते अनुसरण कर रहे हैं (मुझे यकीन है कि वहाँ और अधिक कर रहे हैं हूँ):हास्केल अंडरस्कोर बनाम स्पष्ट चर
संस्करण 1
indexedElement :: [a] -> Int -> a
indexedElement xs n | n < 0 = error "Index can not be negative."
indexedElement [] n = error "Index must be smaller than the length of the list."
indexedElement (x:xs) 0 = x
indexedElement (x:xs) n = indexedElement xs (n - 1)
संस्करण 2
indexedElement :: [a] -> Int -> a
indexedElement _ n | n < 0 = error "Index can not be negative."
indexedElement [] _ = error "Index must be smaller than the length of the list."
indexedElement (x:_) 0 = x
indexedElement (_:xs) n = indexedElement xs (n - 1)
दो संस्करण स्पष्ट रूप से बहुत समान हैं। दोनों के बीच एकमात्र अंतर एक स्पष्ट चर या अंडरस्कोर का उपयोग है। मेरे लिए _
का अर्थ है कि सचमुच कुछ भी लिखा जा सकता है जबकि एक स्पष्ट चर जैसे n
यह और अधिक स्पष्ट करता है कि तर्क एक पूर्णांक होना चाहिए। इसी कारण से, मैं संस्करण 1 पसंद करता हूं; लेकिन (!!)
के लिए जीएचसी स्रोत कोड संस्करण 2 की तरह लिखा गया है। क्या दूसरे संस्करण का एक कार्यात्मक लाभ है? यदि नहीं, तो "कट्टर" हास्केल प्रोग्रामर संस्करण 1 के साथ समस्या उठाएंगे? मैं कोड लिखने का एक सतत तरीका रखने के महत्व को समझता हूं, इसलिए मैं किसी विशेष भाषा में प्रोग्रामिंग के लिए "अवांछित नियम" का पालन करने का प्रयास करता हूं। यह एक उदाहरण है जहां मैं पहले संस्करण को पसंद करता हूं, और मुझे नहीं लगता कि यह कोड को पढ़ने में और भी मुश्किल बनाता है। मुझे नहीं पता कि यह शुद्ध गणित में मेरी पृष्ठभूमि के कारण है या क्या, लेकिन मैं यह जानना चाहता हूं कि आप और अधिक अनुभवी-हास्केल वैट सोचते हैं।
मैं प्रदर्शन मतभेदों के बारे में यकीन है कि (आप की कोशिश कर सकते नहीं कर रहा हूँ दोनों संस्करणों के मूल को आउटपुट करने के लिए यह देखने के लिए कि क्या कोई अंतर है), लेकिन अधिकांश हैकेलर दूसरे संस्करण को पसंद करेंगे क्योंकि इससे बाध्य होने वाले नामों की संख्या कम हो जाती है। '_' का अर्थ है कि कोई भी मूल्य वहां जा सकता है (जब तक कि सही प्रकार, जो कि प्रकार हस्ताक्षर द्वारा दिया जाता है। जबकि यह उपयोग में नहीं होने पर भी पूर्णांक को इंगित करने के लिए 'n' का उपयोग करने के लिए अधिक प्राकृतिक महसूस हो सकता है, ध्यान रखें कि हर किसी के पास पूर्वाग्रह नहीं होगा। – bheklilr
आप '_n'' का उपयोग करते समय चेतावनियों को बंद कर सकते हैं, जो '-Wall' का उपयोग करते समय चेतावनियों को बंद कर देता है, इंगित करता है कि चर का उपयोग नहीं किया जाता है और इसे एक ही समय में नामित किया जाता है। – luqui
@bheklilr ठीक है, मैं आपके इनपुट की सराहना करता हूं। मैं '_' के साथ और अधिक आरामदायक होने के लिए खुद को प्रशिक्षित करूंगा। धन्यवाद। – basketballfan22