मैं हास्केल और प्रोग्रामिंग दोनों के लिए नया हूं। पैटर्न-मिलान, रिकर्सिव फ़ंक्शंस में बाध्यकारी के बारे में मेरा प्रश्न। उदाहरण के लिए, मान लीजिए कि मेरे पास एक ऐसा फ़ंक्शन है जो जांचता है कि दी गई सूची (x: xs) किसी अन्य सूची का उपमहाद्वीप है, (y: ys)। मेरे प्रारंभिक सोचा, मेरे पाठ्यपुस्तक में उदाहरण निम्नलिखित, था:हास्केल - पैटर्न मिलान और रिकर्सन
sublist [] ys = True
sublist xs [] = False
sublist (x:xs) (y:ys)
| x == y = sublist xs ys
| x /= y = sublist (x:xs) ys
यह परीक्षण डेटा, उदा पर काम करता है,
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
जहाँ मैं यह उम्मीद विफल। मैं इसे विफल करने की उम्मीद है, क्योंकि
sublist [1, 2, 3] [1, 2, 4, 1, 2, 3]
= sublist [2, 3] [2, 4, 1, 2, 3]
= sublist [3] [4, 1, 2, 3]
और इस बिंदु पर, मैंने सोचा, [3] = 3: sublist में [4, 1, 2, 3, और: [] के साथ (XS एक्स) मिलान किया जाएगा ] sublist में (वाई: वाईएस) के साथ मिलान किया जाएगा। तो, कैसे काम कर रहा है?
संपादित करें: यहां सभी को धन्यवाद, मुझे लगता है कि मैंने अपनी समस्या हल कर ली है। जैसा कि ध्यान दिया गया था, मैं ("अवचेतन रूप से") मेरे लिए बैकट्रैक के लिए उपन्यास चाहता था। अंतिम उत्तर का उपयोग (बीएमएफ) एक गाइड के रूप में पोस्ट किया गया, मैंने "बाध्यकारी समस्या" को हल करने के लिए समस्या को अलग करने का फैसला किया, यानी "बैकट्रैकिंग" समस्या।
subseq :: (Eq a) => [a] -> [a] -> Bool
subseq [] _ = True
subseq _ [] = False
subseq (x:xs) (y:ys) =
-- subseq' decides whether the list bound to (x:xs) = M is a prefix of the list
-- bound to L = (y:ys); it recurses through L and returns a Bool value. subseq
-- recurses through M and L, returning a disjunction of Bool
-- values. Each recursive call to subseq passes M and ys to subseq', which
-- decides whether M is a prefix of the **current list bound to ys**.
let subseq' :: (Eq a) => [a] -> [a] -> Bool
subseq' [] _ = True
subseq' _ [] = False
subseq' (x:xs) (y:ys) = (x == y) && subseq' xs ys
in subseq' (x:xs) (y:ys) || subseq (x:xs) ys
यह स्पष्ट नहीं है, क्या विफल हो रहा है और क्या आप असफल करने की उम्मीद कर रहे हैं। आपके उदाहरण में, [3] [4,1,2,3] का एक उपन्यास है, इसलिए मैच होगा। मुझे लगता है कि आप जो चाहते हैं वह नहीं है। – mb14
प्रोग्रामिंग और हास्केल से शुरू करने के लिए नया? मैं उसका सम्मान करता हूँ! जब आप यह देखने के लिए देखते हैं कि अनिवार्य प्रोग्रामिंग में हममें से बाकी को कोड लिखना है तो आप दर्द की दुनिया में हैं। : पी – wheaties
क्षमा करें, मुझे स्पष्ट होना चाहिए था: मुझे उम्मीद थी कि फ़ंक्शन जो मैं चाहता था वह करने में असफल रहा, जो था: यह पता लगाएं कि कोई विशेष अनुक्रम, उदाहरण के लिए, (1: 2: 3: []), एक सूची में होता है, उदाहरण के लिए, (4: 1: 2: []), उस क्रम में। अप्रत्यक्ष रूप से, मैं पूछ रहा था कि मेरे "उपन्यास" फ़ंक्शन को मूल (x: xs) को फिर से शुरू करने के लिए कैसे प्राप्त करें (x/= y) सत्य पर मूल्यांकन किया गया। – danportin