अच्छी तरह से, इस foldr का उपयोग कर फिल्टर समारोह की परिभाषा है:क्या मैं फ़ोल्डर के संदर्भ में फ़िल्टर की परिभाषा के बारे में ध्वनि समीकरण तर्क का उपयोग कर रहा हूं?
myFilter p xs = foldr step [] xs
where step x ys | p x = x : ys
| otherwise = ys
तो उदाहरण के लिए मान लीजिए कि मैं इस कार्य हो जाने:
myFilter odd [1,2,3,4]
तो यह हो जाएगा:
foldr step [] [1,2,3,4]
और यह
step 1 (foldr step [] [2,3,4])
,210
और इस
step 1 (step 2 (foldr step [] [3,4]))
हो जाएगा और इस
step 1 (step 2 (step 3 (foldr step [] [4])))
हो जाएगा और इस
step 1 (step 2 (step 3 (step 4 (foldr step [] []))))
और foldr step [] []
हो जाएगा तो []
है:
step 1 (step 2 (step 3 (step 4 [])))
अब हम वास्तव में step
फ़ंक्शन में पहुंच जाएंगे।
यहाँ, myFilter
समारोह अंदर step
की परिभाषा है ऊपर से:
step x ys | p x = x : ys
| otherwise = ys
भी, मैं तुम्हें याद दिलाना है कि p
वास्तव में हमारे उदाहरण में odd
कार्य है। अजीब
step 1 (step 2 (step 3 (step 4 [])))
और
सबसे भीतरी step
में x = 4
, और 4
नहीं है, तो हम ys
लौटने, जो []
है:
अच्छी तरह से, फिर से, हम यहाँ हैं तो अब हम इसे प्राप्त करते हैं:
step 1 (step 2 (step 3 []))
अब, में सबसे भीतरी step
, x = 3
, और 3
अजीब है, इसलिए हम x:ys
लौटने के लिए, जो 3 : []
है, जो [3]
है, और अब हम पाते हैं:
step 1 (step 2 [3])
और अब, भीतरी step
में, x = 2
, और 2
अजीब नहीं है, इसलिए हम ys
लौटने के लिए, जो [3]
है, इसलिए अब हम मिल जाएगा:
step 1 [3]
और अब, x = 1
, और 1
अजीब है, इसलिए हम x : ys
लौटते हैं, जो 1 : [3]
है, जो [1,3]
है।
अंत :-)।
क्या मैं अपनी सभी चालों में सही हूं?
बहुत बहुत धन्यवाद :-)।
पेज। myFilter
की परिभाषा अध्याय 4 में Real World Haskell पुस्तक से है।
धन्यवाद। अच्छी तरह से, मैं हैकेल में बहुत नौसिखिया हूं, इसलिए मुझे हैकेल के सभी "बैकस्टेज" को नहीं पता है। मुझे बस यह जानने की जरूरत है कि यह इस तरह है या नहीं। शायद किताब के बाद के अध्यायों में, वे आपने जो मुझे यहां (जो मैं अधिक पढ़ने की जरूरत है, यह समझना) बहुत बहुत शुक्रिया :-) सिखाने की कोशिश की के बारे में चर्चा करेंगे। – Elimelech
मुझे लगता है कि आप सही रास्ते पर हैं। मैं इसे "बैक एंड" कहूंगा, यह समझने के लिए कि आलसी मूल्यांकन कैसे काम करता है। इस तरह एक साधारण मामले के लिए यह कोई बात नहीं है, लेकिन जब आप देखते हैं कि 'foldr' अनंत सूची पर काम करता है और' foldl' नहीं आते हैं, यह आप समझ क्यों मदद मिलेगी। – Dan