Skip to content

Implement foldl-related folds for PostOrder - #1259

Merged
meooow25 merged 3 commits into
haskell:masterfrom
meooow25:postorder-foldl
Sep 30, 2026
Merged

meooow25 merged 3 commits into
haskell:masterfrom
meooow25:postorder-foldl

Conversation

@meooow25

@meooow25 meooow25 commented Sep 26, 2026 •

Copy link
Copy Markdown
Contributor

PostOrder is able to incrementally produce elements from the end of
sequence represented by the Foldable instance.

Closes #1247


Benchmarks with GHC 9.14:

Name                                                           Time - - - - - - - -    Allocated - - - - -
                                                                    A       B     %         A       B     %
PostOrder.Foldable.foldl1.bin,n=1000                           5.2 μs  2.4 μs  -54%     77 KB   31 KB  -59%
PostOrder.Foldable.foldl1.bin,n=1000000                        8.0 ms  2.9 ms  -63%     76 MB   31 MB  -59%
PostOrder.Foldable.foldl1.line,n=1000                          2.0 μs  2.0 μs   +2%     23 KB   23 KB   +0%
PostOrder.Foldable.foldl1.line,n=1000000                       1.9 ms  2.0 ms   +3%     23 MB   23 MB   +0%
PostOrder.Foldable.folds.bin,n=1000.foldl_cpsOneShotSum         13 μs  5.0 μs  -61%    164 KB   70 KB  -57%
PostOrder.Foldable.folds.bin,n=1000.foldl_cpsSum                13 μs  9.2 μs  -29%    164 KB  133 KB  -19%
PostOrder.Foldable.folds.bin,n=1000.foldl_elem                 5.3 μs  2.4 μs  -55%     78 KB   31 KB  -60%
PostOrder.Foldable.folds.bin,n=1000.foldl_traverseSum           12 μs  7.1 μs  -41%    133 KB  101 KB  -23%
PostOrder.Foldable.folds.bin,n=1000.foldr'_maximum              13 μs  2.9 μs  -77%    149 KB  160 B   -99%
PostOrder.Foldable.folds.bin,n=1000.foldr'_sum                  13 μs  2.1 μs  -83%    164 KB   16 B   -99%
PostOrder.Foldable.folds.bin,n=1000000.foldl_cpsOneShotSum      15 ms  5.9 ms  -60%    160 MB   69 MB  -57%
PostOrder.Foldable.folds.bin,n=1000000.foldl_cpsSum             14 ms   11 ms  -21%    160 MB  130 MB  -19%
PostOrder.Foldable.folds.bin,n=1000000.foldl_elem              8.2 ms  3.1 ms  -62%     76 MB   31 MB  -60%
PostOrder.Foldable.folds.bin,n=1000000.foldl_traverseSum        13 ms  8.2 ms  -39%    130 MB   99 MB  -23%
PostOrder.Foldable.folds.bin,n=1000000.foldr'_maximum           14 ms  3.5 ms  -75%    145 MB  624 B   -99%
PostOrder.Foldable.folds.bin,n=1000000.foldr'_sum               14 ms  2.8 ms  -80%    160 MB  316 B   -99%
PostOrder.Foldable.folds.line,n=1000.foldl_cpsOneShotSum        11 μs  4.0 μs  -63%    164 KB   70 KB  -57%
PostOrder.Foldable.folds.line,n=1000.foldl_cpsSum               11 μs  7.4 μs  -32%    164 KB  133 KB  -19%
PostOrder.Foldable.folds.line,n=1000.foldl_elem                4.7 μs  2.0 μs  -57%     78 KB   31 KB  -60%
PostOrder.Foldable.folds.line,n=1000.foldl_traverseSum         9.8 μs  6.1 μs  -37%    133 KB  101 KB  -23%
PostOrder.Foldable.folds.line,n=1000.foldr'_maximum             12 μs  2.6 μs  -77%    164 KB   16 KB  -90%
PostOrder.Foldable.folds.line,n=1000.foldr'_sum                 11 μs  2.0 μs  -81%    164 KB   16 B   -99%
PostOrder.Foldable.folds.line,n=1000000.foldl_cpsOneShotSum     11 ms  4.1 ms  -63%    160 MB   69 MB  -57%
PostOrder.Foldable.folds.line,n=1000000.foldl_cpsSum            11 ms  7.1 ms  -37%    160 MB  130 MB  -19%
PostOrder.Foldable.folds.line,n=1000000.foldl_elem             6.6 ms  1.9 ms  -71%     76 MB   31 MB  -60%
PostOrder.Foldable.folds.line,n=1000000.foldl_traverseSum      9.8 ms  6.1 ms  -38%    130 MB   99 MB  -23%
PostOrder.Foldable.folds.line,n=1000000.foldr'_maximum          12 ms  2.6 ms  -78%    160 MB   15 MB  -90%
PostOrder.Foldable.folds.line,n=1000000.foldr'_sum              11 ms  2.0 ms  -82%    160 MB  649 B   -99%
PostOrder.Foldable1.foldlMap1.bin,n=1000                       3.1 μs  3.1 μs   +0%     62 KB   62 KB   +0%
PostOrder.Foldable1.foldlMap1.bin,n=1000000                    3.7 ms  3.9 ms   +4%     61 MB   61 MB   +0%
PostOrder.Foldable1.foldlMap1.line,n=1000                      3.4 μs  3.3 μs   -3%     62 KB   62 KB   +0%
PostOrder.Foldable1.foldlMap1.line,n=1000000                    29 ms   30 ms   +1%     61 MB   61 MB   +0%

PostOrder is able to incrementally produce elements from the end of
sequence represented by the Foldable instance.

These explicit implementations perform better than the class defaults.
@meooow25
meooow25 merged commit 6035461 into haskell:master Sep 30, 2026
19 checks passed
@meooow25
meooow25 deleted the postorder-foldl branch September 30, 2026 18:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PostOrder: foldl and foldr'

1 participant