Sunday, 15 February 2015

Scala Pattern Matching Enigma -


यहाँ Scala () में 99 समस्याओं के तृतीय समस्या (P03) का मेरा प्रयास है:

  आयात स्कला.अनोटेशन। _ // सूची के एनएथ तत्व खोजें। // nth (2, सूची (1, 1, 2, 3, 5, 8)) = 2 ऑब्जेक्ट P03 {@tailrec def nth [A] (n: Int, ls: सूची [ए]): ए = (n , एलएस) मैच {केस (0, एच :: टी :: निल) = & gt; एच केस (एन, _ :: टी) = & gt; Nth (n - 1, t) केस _ = & gt; println (एन);  

पहेली यह कोड प्रिंट करती है -4 और एक अवैध अर्गममेंट अपवाद

कोर्स का समाधान पहला पैटर्न बदलने के लिए है:

  केस (0, एच :: _) = & gt; एच  

यह अब सही उत्तर प्रिंट करता है 2

प्रश्न क्यों है? इस बीच का सूक्ष्म अंतर क्या है:

  मामला (0, एच :: टी :: निल) = & gt; एच  

और

  मामला (0, एच :: _) = & gt; एच  

धन्यवाद!

अंतर यह है कि एच :: टी :: नील दो तत्वों ( h और t , शून्य ) के लिए केवल एक सूची से मिलान करता है एक सूची के अंत (मैं 100% यकीन नहीं करता हूँ कि यह सही नामकरण है)) जबकि h :: _ प्रत्येक गैर खाली सूची से मेल खाता है, यानी एक सूची जिसमें कम से कम एक तत्व है, यदि आप जांचते हैं :: वर्ग आप देखेंगे:

  अंतिम मामला वर्ग :: [बी] (निजी var एचडी: बी, निजी [स्कला] var tl: सूची [बी] ]) सूची [बी]  

का विस्तार करती है, जिसमें एक सिर और एक पूंछ है जहां पहली सूची का पहला तत्व है और दूसरा बाकी है, h पर मेल खाता है। टी :: नील का मतलब पूंछ के पहले की तुलना में सूची का पहला तत्व है, और फिर शून्य होना चाहिए, h :: _ का अर्थ है सिर प्राप्त करना और तब तक आप परवाह नहीं है कि जब तक कोई सिर है, तब तक क्या बचा है।


No comments:

Post a Comment