2015-11-24 7 views
6

मैं कुछ हफ्तों के लिए हास्केल सीख रहा हूं, और मेरे पास फ़ंक्शन पैरामीटर के रूप में अंडरस्कोर (_) के उपयोग के बारे में एक प्रश्न है। मुझे लगता है कि मेरे प्रश्न को एक विशिष्ट उदाहरण से बेहतर तरीके से पूछा जाएगा। आइए मान लें कि मैं एक ऐसे फ़ंक्शन को परिभाषित करना चाहता हूं जो प्रदत्त इंडेक्स-हां के आधार पर सूची के तत्व को निकालता है, मुझे एहसास है कि (!!) पहले ही परिभाषित है। दो तरह से है कि मैं समारोह को परिभाषित कर सकते अनुसरण कर रहे हैं (मुझे यकीन है कि वहाँ और अधिक कर रहे हैं हूँ):हास्केल अंडरस्कोर बनाम स्पष्ट चर

संस्करण 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 के साथ समस्या उठाएंगे? मैं कोड लिखने का एक सतत तरीका रखने के महत्व को समझता हूं, इसलिए मैं किसी विशेष भाषा में प्रोग्रामिंग के लिए "अवांछित नियम" का पालन करने का प्रयास करता हूं। यह एक उदाहरण है जहां मैं पहले संस्करण को पसंद करता हूं, और मुझे नहीं लगता कि यह कोड को पढ़ने में और भी मुश्किल बनाता है। मुझे नहीं पता कि यह शुद्ध गणित में मेरी पृष्ठभूमि के कारण है या क्या, लेकिन मैं यह जानना चाहता हूं कि आप और अधिक अनुभवी-हास्केल वैट सोचते हैं।

+6

मैं प्रदर्शन मतभेदों के बारे में यकीन है कि (आप की कोशिश कर सकते नहीं कर रहा हूँ दोनों संस्करणों के मूल को आउटपुट करने के लिए यह देखने के लिए कि क्या कोई अंतर है), लेकिन अधिकांश हैकेलर दूसरे संस्करण को पसंद करेंगे क्योंकि इससे बाध्य होने वाले नामों की संख्या कम हो जाती है। '_' का अर्थ है कि कोई भी मूल्य वहां जा सकता है (जब तक कि सही प्रकार, जो कि प्रकार हस्ताक्षर द्वारा दिया जाता है। जबकि यह उपयोग में नहीं होने पर भी पूर्णांक को इंगित करने के लिए 'n' का उपयोग करने के लिए अधिक प्राकृतिक महसूस हो सकता है, ध्यान रखें कि हर किसी के पास पूर्वाग्रह नहीं होगा। – bheklilr

+5

आप '_n'' का उपयोग करते समय चेतावनियों को बंद कर सकते हैं, जो '-Wall' का उपयोग करते समय चेतावनियों को बंद कर देता है, इंगित करता है कि चर का उपयोग नहीं किया जाता है और इसे एक ही समय में नामित किया जाता है। – luqui

+0

@bheklilr ठीक है, मैं आपके इनपुट की सराहना करता हूं। मैं '_' के साथ और अधिक आरामदायक होने के लिए खुद को प्रशिक्षित करूंगा। धन्यवाद। – basketballfan22

उत्तर

17

क्या दूसरे संस्करण का कोई कार्यात्मक लाभ है?

मुझे नहीं लगता कि उनके पास कोई परिचालन अंतर है। लेकिन मुझे दूसरा संस्करण अधिक पठनीय लगता है। _ इंगित करता है कि इसका उपयोग बिल्कुल नहीं किया जाता है। तो कोड पढ़ने के दौरान, मैं इसे केवल अनदेखा कर सकता हूं और बस अन्य पैरामीटर पर ध्यान केंद्रित कर सकता हूं। जबकि पहले संस्करण में, मैं सोच रहा हूं कि n परिभाषित किया गया है लेकिन शायद लेखक इसका उपयोग करना भूल गए? या शायद तर्क की आवश्यकता नहीं है। दूसरा संस्करण सिर्फ इस प्रकार के मानसिक अधिभार से बचाता है। लेकिन यह सिर्फ मेरी राय है। :)

वास्तव में, यदि आप चेतावनी झंडा (-Wall) सक्षम और अपने कोड संकलन, यह आपके पहले संस्करण के लिए चेतावनी फेंक देते हैं:

[1 of 1] Compiling Main    (code.hs, code.o) 

code.hs:2:16: Warning: Defined but not used: ‘xs’ 

code.hs:3:19: Warning: Defined but not used: ‘n’ 

code.hs:4:19: Warning: Defined but not used: ‘xs’ 

code.hs:5:17: Warning: Defined but not used: ‘x’ 

code.hs:8:17: Warning: Defined but not used: ‘xs’ 
+0

बहुत बहुत धन्यवाद। जैसा कि मैंने अपनी पोस्ट में उल्लेख किया है, मैं बहुत लंबे समय तक हास्केल में प्रोग्रामिंग नहीं कर रहा हूं; नतीजतन, मैं कभी भी 'वाह' के बारे में नहीं जानता था। यह कैसे चालू करता है? क्या मैं बस अपने स्रोत कोड की शुरुआत में '-Wall' टाइप करता हूं; और यदि हां, तो क्या यह किसी भी आयात से पहले होना चाहिए? – basketballfan22

+1

@ बास्केटबॉलफैन 22: यह कंपाइलर के लिए एक कमांड लाइन विकल्प है। यदि आप 'ghc' कमांड के साथ हाथ से संकलित कर रहे हैं, तो आप इसे वहां आपूर्ति करते हैं। यदि आप काबेल या स्टैक जैसे निर्माण उपकरण का उपयोग कर रहे हैं, तो उनके लिए प्रलेखन आपके प्रोजेक्ट के जीएचसी विकल्पों को कॉन्फ़िगर करने का तरीका बताएगा। –

+0

@LuisCasillas: आह! वह तो कमाल है। सहायता के लिए धनयवाद। – basketballfan22

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