हम myReverse [1,2,3]
के मूल्यांकन के माध्यम से कदम उठा सकते हैं। हम foldl
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
की परिभाषा की जरूरत है तो हम पर महत्वपूर्ण चेतावनी के साथ
myReverse [1,2,3,4]
-- definition of myReverse
= foldl (\a x -> x:a) [] [1,2,3]
-- definition of foldl (x:xs case)
= foldl (\a x -> x:a) ((\a x -> x:a) [] 1) [2,3]
-- beta reduction [1]
= foldl (\a x -> x:a) [1] [2,3]
-- definition of foldl
= foldl (\a x -> x:a) ((\a x -> x:a) [1] 2) [3]
-- beta reduction
= foldl (\a x -> x:a) [2,1] [3]
-- definition of foldl
= foldl (\a x -> x:a) ((\a x -> x:a) [2,1] 3) []
-- beta reduction
= foldl (\a x -> x:a) [3,2,1] []
-- definition of foldl ([] case)
= [3,2,1]
है [1] और प्रत्येक बीटा कमी कदम है कि इस बीटा कमी वास्तव में केवल होता है जब कुछ परिणाम की जांच के लिए। foldl
प्रगति है, f
के बार-बार आवेदन पत्र Thunks रूप का निर्माण, तो क्या हम वास्तव में मिलता है (यदि f = \a x -> x:a
) है:
foldl f [] [1,2,3]
foldl f (f [] 1) [2,3]
foldl f ((f 2 (f [] 1))) [3]
foldl f (((f 3 ((f 2 (f [] 1)))))) []
(((f 3 ((f 2 (f [] 1))))))
यही कारण है कि हम foldl'
है, जो अपने संचायक में सख्त है और इस thunk से बचाता है बनाया।
प्रारंभिक मान []
है। इस मामले में [b]
foldl
में समान है, जो में [a]
है।
स्रोत
2017-12-21 03:34:23