खोजने के लिए पैटर्न का उपयोग करना मैं के माध्यम से काम कर रहा हूं Haskell की मूल बातें के साथ गति के लिए आने के लिए आपको एक हास्केल सीखें। मैं दोनों कार्यात्मक प्रोग्रामिंग और पैटर्न मिलान के साथ बहुत सहज हूं, लेकिन बाद में गणित यह करता है।एनएच तत्व
अध्याय 4.1 में head
की भोली कार्यान्वयन के रूप में ही भावना में, मैं last
के रूप में की एक सीधी सादी कार्यान्वयन के साथ रवाना हुए:
last1 :: [a] -> a
last1 (_:x:[]) = x
हालांकि, बुला last1 [1,2,3,4]
एक त्रुटि Exception: ... Non-exhaustive patterns in function last1
दे दी है। मैं समझता हूं कि यह त्रुटि दर्शाती है कि निर्दिष्ट पैटर्न में सभी संभावित इनपुट शामिल नहीं होते हैं और आमतौर पर, एक पकड़-सभी पैटर्न आवश्यक है (जो मैंने प्रदान नहीं किया है)। हालांकि, मुझे बिल्कुल यकीन नहीं है कि मुझे अपने इनपुट के लिए यह त्रुटि क्यों मिलती है।
प्रश्न 1: (मेरी गलत दृष्टिकोण का) मेरी समझ है कि पहला तत्व _
द्वारा कब्जा कर लिया है और बाकी x
को असाइन किए जाएंगे, जो नहीं है मैं वास्तव में क्या चाहते थे, है। हालांकि, यह एक प्रकार की त्रुटि नहीं देनी चाहिए, क्योंकि मैंने [a] -> a
निर्दिष्ट किया है, लेकिन x
अब एक सूची है?
ध्यान दें कि यह कैसे एक काम last
समारोह लिखने के बारे में नहीं है - मैं जानता हूँ कि मैं के रूप में (अन्य संभावनाओं के बीच)
last2 :: [a] -> a
last2 [x] = x
last2 (_:x) = last2 x
प्रश्न 2 यह लिख सकते हैं: बेहतर का एक ही विषय के साथ हास्केल में मिलान पैटर्न को समझना, मैं पिछले तत्व को चुनने के लिए पैटर्न मिलान का उपयोग कैसे कर सकता हूं या अधिक सामान्य रूप से n
किसी दिए गए सूची से वें तत्व, [1..10]
कह सकता हूं?
This answer पता चलता है कि आप ViewPatterns
विस्तार के साथ मिलान पद्धति का उपयोग कर पिछले तत्व बाध्य कर सकते हैं, लेकिन यह अजीब लगता है के लिए head
की तरह एक अनुरूप "सरल" पैटर्न में मेथेमेटिका, मैं होता नहीं है कि शायद इसे लिखने के रूप में:
Range[10] /. {Repeated[_, {5}], x_, ___} :> x
(* 6 *)
6 तत्व और
Range[10] /. {___, x_} :> x
(* 10 *)
बाहर लेने के लिए एक गैर-खाली सूची के अंतिम तत्व को चुनने के लिए
।
मैं क्षमा चाहता हूं कि यह बाद में पाठ में शामिल है, लेकिन मैं प्रत्येक विषय और अवधारणा से संबंधित होने की कोशिश कर रहा हूं क्योंकि मैं उन सभी भाषाओं में कैसे संभाला जाता हूं, जिन्हें मैं जानता हूं ताकि मैं मतभेदों की सराहना कर सकूं और समानताएं।
स्पष्टीकरण के लिए धन्यवाद! इससे यह स्पष्ट हो जाता है कि यह क्यों काम नहीं कर रहा था। क्या एकाधिक तत्वों से मेल खाने के लिए कोई पैटर्न है? उदाहरण के लिए, मेरे गणित उदाहरण (अंत में) में '{___, x_}' पंक्ति में, '___' का अर्थ है "शून्य या अधिक" और '_' का अर्थ है" बिल्कुल एक "। इससे मुझे अंतिम तत्व को छोड़कर सबकुछ त्यागने की अनुमति मिलती है, क्योंकि अब मैंने सूची की संरचना का स्पष्ट रूप से वर्णन किया है। मैं समझता हूं कि यह शायद वाक्य रचनात्मक चीनी है और वास्तविक रिकर्सन/बैकट्रैकिंग हुड के नीचे छिपी हुई है। – abcd
@yoda Haskell के पैटर्न मिलान के साथ ऐसा करने का कोई तरीका नहीं है (जिसे मैं कम से कम जानता हूं)। यह एक गणित विशिष्ट विशेषता की तरह लगता है। आम तौर पर, हास्केल का डिज़ाइन आम तौर पर "विशेष" डेटा प्रकारों से बचाता है जो बहुत सी अतिरिक्त घंटियाँ और सीटी (सूचियों और टुपल्स के लिए कुछ अच्छे वाक्यविन्यास को छोड़कर) प्राप्त करते हैं। हास्केल भाषा में अतिरिक्त सामान जोड़ने पर कार्यों को पसंद करता है। – sabauma
धन्यवाद, यही मैंने सोचा था। मैं इस दर्शन की सराहना भी कर सकता हूं ... मुझे थोड़ा और सोचने के लिए मजबूर करता है। कम से कम, मुझे इसके साथ कार्यात्मक प्रोग्रामिंग सीखने की चिंता करने की ज़रूरत नहीं है! :) – abcd