मेरे समझ के साथ कि foldl
और foldr
तरह निष्पादित होता है:क्यों फ़ोल्डल और एफएन फ़ंक्शन के साथ छोटा सर्किटिंग नहीं है?
foldl f a [1..30]
=>(f (f (f ... (f a 1) 2) 3) ... 30)
और
foldr f a [1..30]
=>(f 1 (f 2 (f 3 (f ....(f 30 a)))))..)
तो .. foldr (&&) False (repeat False)
(&&) False ((&&) False (....))
पहले देखता है के रूप में सबसे बाहरी f
देखता shortciruit कर सकते हैं तर्क के रूप में तर्क और दूसरे तर्क का मूल्यांकन करने की आवश्यकता नहीं है (जो एक बड़ा थंक है)।
तो
andFn :: Bool -> Bool -> Bool
andFn _ False = False
andFn x True = x
और
foldl andFn True (repeat False) -- =>
-- (andFn (andFn ...(andFn True False) ... False) False)
-- ^^ outermost andFn
साथ क्या होता है लेकिन इस हमेशा के लिए ले जा रहा है।
मैंने सोचा था कि outermost andFn
पता होगा कि कि दूसरा तर्क पर मिलान पैटर्न से, जवाब False
है ..
यहाँ और क्या हो रहा है?