वास्तव में, (foldl.foldr) f z xs === foldr f z (concat $ reverse xs)
में की तरह, कई बार उठा सकते हैं।
भले ही f
एक सहयोगी संचालन है, अनुप्रयोगों का सही अनुक्रम, क्योंकि इसका प्रदर्शन पर असर पड़ सकता है।
हम शुरू
(foldl.foldr) f z xs
foldl (foldr f) z xs
g = foldr f
और [x1,x2,...,xn_1,xn] = xs
एक पल के लिए के साथ लेखन के साथ, इस
(foldl.foldr) 1 [[1,2,3],[4,5,6]]
4+(5+(6+( 1+(2+(3+ 1)))))
22
बुद्धि के लिए है आपके मामले में
(...((z `g` x1) `g` x2) ... `g` xn)
(`g` xn) ((`g` xn_1) ... ((`g` x1) z) ...)
foldr f z $ concat [xn,xn_1, ..., x1]
foldr f z $ concat $ reverse xs
तो है सही कमी अनुक्रम ,
Prelude> (foldl.foldr) (:) [] [[1..3],[4..6],[7..8]]
[7,8,4,5,6,1,2,3]
इसी
, (foldl.foldl) f z xs == foldl f z $ concat xs
। snoc a b = a++[b]
,
Prelude> (foldl.foldl) snoc [] [[1..3],[4..6],[7..8]]
[1,2,3,4,5,6,7,8]
इसके अलावा, (foldl.foldl.foldl) f z xs == (foldl.foldl) (foldl f) z xs == foldl (foldl f) z $ concat xs == (foldl.foldl) f z $ concat xs == foldl f z $ concat (concat xs)
, आदि .:
Prelude> (foldl.foldl.foldl) snoc [] [[[1..3],[4..6]],[[7..8]]]
[1,2,3,4,5,6,7,8]
Prelude> (foldl.foldr.foldl) snoc [] [[[1..3],[4..6]],[[7..8]]]
[7,8,1,2,3,4,5,6]
Prelude> (foldl.foldl.foldr) (:) [] [[[1..3],[4..6]],[[7..8]]]
[7,8,4,5,6,1,2,3]
के साथ मुझे नहीं लगता कि यह आवेदनों की सही क्रम डैनियल है, है। जैसे ही आप दिखाते हैं, '7' को मजबूर नहीं किया जाएगा, आईएमओ। –
हां, यह - ऑप्टिमाइज़ेशन को छोड़कर - एक थंक बना रहेगा जब तक कि 'फोल्ड' द्वारा उत्पादित अंतिम परिणामस्वरूप थंक का मूल्यांकन नहीं किया जाता है। लेकिन समय-समय पर इसका मूल्यांकन करना कम था और इसे और अधिक पठनीय बनाता है। –