[Proposal] Strict `sum` and `product`

Hécate hecate at glitchbra.in
Sun Oct 18 20:11:09 UTC 2020


Indeed, and I initially went to suggest a `foldMap'`-based 
implementation to keep with the current implementation of many Foldable 
functions that are based on `foldMap` rather than a raw `fold`.

On 18/10/2020 22:04, Oleg Grenrus wrote:
> For the sake of bigger audience I didn't bother mentioning #. which is 
> a coercion helper. It's essentially better (.) when the first argument 
> is newtype constructor (i.e. coerce).
>
> So with Option A (strict):
>
>     sum = getSum #. foldMap' Sum
>
> Or Option B (lazy)
>
>     sum = getSum #. foldMap Sum
>
> ---
>
> There is also third option, Option C:
>
>     sum  = foldr  (+) 0
>     sum' = foldl' (+) 0
>
> I don't think this is worthwhile, but it is an option.
> (to rehash, I don't consider maintaining status quo to be an option at 
> all).
>
> - Oleg
> On 18.10.2020 22.54, Vanessa McHale wrote:
>>
>> 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
>>
>> _______________________________________________
>> 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

-- 
Hécate ✨
IRC: Uniaika
WWW: https://glitchbra.in
RUN: BSD

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20201018/b5a31301/attachment.html>


More information about the Libraries mailing list