[Proposal] Strict `sum` and `product`

Oleg Grenrus oleg.grenrus at iki.fi
Sun Oct 18 19:49:05 UTC 2020


The problem is the current definition of sum for lists which uses foldl,
i.e non-strict left fold

    sum = foldl (+) 0

It's utterly broken. Either we should change it to foldl' to work on
some types where addition is strict, Option A:

    sum = foldl' (+) 0

or alternatively (to make people using lazy accumulator types), Option B:

    sum = foldr (+) 0

The current state is no good for anyone or anything.

---

Related issue which Hecate didn't clearly mention, is that Foldable
class default implementation has

   class Foldable f where
       ...
       sum = getSum . foldMap Sum -- this is "good" lazy definition

If we select option A, then I argue that for consistency the default
`Foldable.sum` should be

       sum = getSum . foldMap' Sum -- strict foldMap'

If we select option B, Foldable definition doesn't need to be changed.

---

I repeat, using non-strict left fold, foldl, for sum and product is not
good for anything.
Either foldr or foldl'.

I have no strong preference. Current state is unacceptable.

-  Oleg

On 18.10.2020 22.24, Henning Thielemann wrote:
>
> On Sun, 18 Oct 2020, Hécate wrote:
>
>> In conclusion, leaving things to the optimiser that could be
>> trivially made fast every time seems needlessly risky.
>
> `seq` is still a hack. A strict 'sum' and 'product' would still fail
> on a lazy accumulator type, say a lazy pair type. If at all, sum and
> product should be deepseq-strict. So currently, letting the optimiser
> make a lazy sum strict is still the smaller hack.
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20201018/7234f619/attachment.html>


More information about the Libraries mailing list