2017-12-21 52 views
5
myReverse :: [a] -> [a] 
myReverse = foldl (\a x -> x:a) [] 

foldl is (a -> b -> a) -> a -> [b] -> a 

लैम्ब्डा फ़ंक्शन स्पष्ट रूप से ब्रैकेट में है। foldl कहां से प्रारंभिक मूल्य प्राप्त करता है? और इस मामले में [b] क्या है?क्या आप यह पता लगा सकते हैं कि यह हास्केल फ़ोल्ड लैम्ब्डा फ़ंक्शन कैसे काम कर रहा है?

उत्तर

2

हम 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] है।

0
myReverse :: [a] -> [a] 
myReverse = foldl (\a x -> x:a) [] 

समतुल्य रूप इसलिए, तह समारोह लैम्ब्डा \a x -> x:a है के रूप में

myReverse :: [a] -> [a] 
myReverse xs = foldl (\a x -> x:a) [] xs 

फिर से लिखा जा सकता है, प्रारंभिक मूल्य [] है, और सूची पर गुना करने के लिए xs है।

संबंधित मुद्दे

 संबंधित मुद्दे