Proposal: make minimumBy/maximumBy go through foldl', not foldr1

Lana Black lanablack at
Wed Feb 10 20:07:22 UTC 2016

>  2 changing the behavior of Foldable.maximumBy (from foldr to foldl)
>    and changing the behavior of Data.List.maximumBy back to what it was before,
>    and arguably the “better” definition.
>  3 adding minimumBy/maximumBy as a class method and changing only the list instance.

The third option is the best, but I'd check for API breakages first.

> This also raises the question of whether using foldl over foldl' is the
> right thing to do, as I was under the impression that foldl will (at
> least for lists)  always just accumulate a large heap of thunks, and
> one would always want to use foldl' instead. I postulate that if foldl'
> had been in the report, then it would have been used for maximumBy.

I tested maximumBy with foldl, and it runs in constant memory for lists,
so extra strictness won't have any benefits in this particular case. The
following snippet clearly shows it.

main = print $ maximumBy compare [1..100000000000]

-- Copied from Data.Foldable with foldl1 replacing foldr1.
maximumBy :: Foldable t => (a -> a -> Ordering) -> t a -> a
maximumBy cmp = foldl1 max'
  where max' x y = case cmp x y of
                          GT -> x
                          _  -> y

More information about the Libraries mailing list