[Proposal] Strict `sum` and `product`

Vanessa McHale vamchale at gmail.com
Sun Oct 18 19:54:33 UTC 2020


It's

sum = getSum #. foldMap Sum

in base.

On 10/18/20 2:49 PM, Oleg Grenrus wrote:
>
> 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
>
> _______________________________________________
> 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/76bc3e57/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: OpenPGP digital signature
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20201018/76bc3e57/attachment.sig>


More information about the Libraries mailing list