, (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
로 쓰는이 올바른 감소 순서가 귀하의 경우
(...((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
그래서 재치으로
(foldl.foldr) 1 [[1,2,3],[4,5,6]]
4+(5+(6+( 1+(2+(3+ 1)))))
22
입니다 시작 ,
마찬가지로 0
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'은 일찌감치 강요 당하지 않을 것입니다, IMO. –
네, 최적화를 제외하고는 'foldl'에 의해 생성 된 최종 결과가 평가 될 때까지 썽크로 남아 있습니다. 그러나 조기에 그것을 평가하는 것은 입력하기가 어려워 읽고 더 쉽게 읽을 수 있습니다. –