haskell - Am I using sound equational reasoning about a definition of filter in terms of foldr? -
अच्छा, यह foldr का उपयोग करते हुए फिल्टर फ़ंक्शन की परिभाषा है:
myFilter p xs = गुना कदम [] एक्स जहां चरण x ys | P x = x: ys | अन्यथा = ys
तो उदाहरण के लिए मान लें कि मुझे यह फ़ंक्शन है:
myFilter odd [1,2,3,4]
< / पूर्व>तो यह हो जाएगा:
गुना कदम [] [1,2,3,4]
और यह होगा < / P>
चरण 1 (गुना कदम [] [2,3,4])
और यह होगा
चरण 1 (चरण 2 (कदम चरण [] [3,4]))
और यह होगा
चरण 1 (चरण 2 (चरण 3 ( [चरण 4 (चरण 3 (चरण 4) (फ़ोल्ड चरण [] [4])))
और यह होगा
चरण 1 (चरण 2 (चरण 3 [ ] []))))
और
फ़ोल्ड चरण [] []
है[]
ऐसा:चरण 1 (चरण 2 (चरण 3 (चरण 4 [])))
अब हम वास्तव में
step
फ़ंक्शन में आएं।
यहां परचरण
की परिभाषा हैmyFilter
फ़ंक्शन, ऊपर से:चरण x ys | P x = x: ys | अन्यथा = ys
भी, मैं आपको याद दिलाता हूं कि
p
वास्तव में हमारे उदाहरण मेंअजीब
फ़ंक्शन है।ठीक है, फिर से, हम यहां हैं:
चरण 1 (चरण 2 (चरण 3 (चरण 4 [])))
और
x = 4
सबसे भीतरीचरण
में, और4
अजीब नहीं है, इसलिए हम वापसys , जो कि
[]
है, अब हम इसे प्राप्त करते हैं:
चरण 1 (चरण 2 (चरण 3 [])) < / कोड>
अब, सबसे भीतरी
चरण
,x = 3
में, और3
अजीब है, इसलिए हमx: ys
, जो3: []
है, जो[3]
है, और अब हम प्राप्त करते हैं:चरण 1 (चरण 2 [3])
और अब, आंतरिक
< प्री>चरण
,x = 2
में, और2
अजीब नहीं है, इसलिए हमys
वापस करते हैं, जो कि[3]
है, इसलिए अब हम प्राप्त करेंगे:चरण 1 [3]
और अब,
x = 1
, और1
अजीब है, इसलिए हमx: ys
वापस आते हैं, जो1: [3]
है, जो[1,3]
है।समाप्ति: -)।
क्या मैं अपनी सारी चाल में हूं?
बहुत बहुत धन्यवाद: -)।ps
myFilter
की परिभाषा पुस्तक से है, अध्याय 4 में।
यह पहले पढ़ने में मुझे सही दिखता है।
हालांकि याद रखने के लिए महत्वपूर्ण बात यह है कि आलसी मूल्यांकन प्राप्त करने के लिए, हास्केल वास्तव में अन्य तरीकों से देखेगा। दूसरे शब्दों में, वास्तविक अनुक्रम अधिक है
चरण 1 (चरण 2 (चरण 3 (चरण 4 [])))
हो जाता है
चरण 1 & lt; block1 & gt;
जो हो जाता है
[1,
तब अगर आप अगली खींचने का प्रयास करते हैं
जो
[1, चरण 2
हो जाता है
और [1, चरण 3 & lt; ब्लॉक 3 & gt;]
जो हो जाता है
[1, 3, & lt; ब्लॉक 3 & gt;]
आदि। यह समझने में मुझे कुछ समय लगा। यह मुझे प्रतिवाद था कि जब से folds
को "अंदर से" से मूल्यांकन किया जाता है, परन्तु foldl
का मूल्यांकन "बाहर" से किया जाता है जो कि foldr
आलसी होगा (जो यह है), जबकि foldl
सख्त है लेकिन अगर आप इसके बारे में सोचते हैं कि मैंने ऊपर उल्लिखित तरीके से, यह समझ में आता है (मुझे, वैसे भी)।
Comments
Post a Comment