で、(foldl.foldr) f z xs === foldr f z (concat $ reverse xs)
を複数回持ち上げることができます。
f
が連想操作であっても、パフォーマンスに影響を与える可能性があるため、アプリケーションの正しい順序が重要です。
私たちは一瞬g = foldr f
と[x1,x2,...,xn_1,xn] = xs
と書い
(foldl.foldr) f z xs
foldl (foldr f) z 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
をです、
同様に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'によって生成された最終的なサンクが評価されるまで、サンクのままです。しかし、それを早期に評価することは、入力することが少なく、読みやすくしました。 –