Component Programming in D

rmr rmr at mailinator.com
Wed Oct 3 17:18:03 PDT 2012


On Wednesday, 3 October 2012 at 19:11:55 UTC, Martin Friesen 
wrote:
> On Wednesday, 3 October 2012 at 01:40:05 UTC, ixid wrote:
>> On Tuesday, 2 October 2012 at 21:27:42 UTC, Andrei 
>> Alexandrescu wrote:
>>> http://www.reddit.com/r/programming/comments/10u6sk/component_programming_in_d/
>>>
>>> Andrei
>>
>> The article contains a bug due to the pernicious behaviour of 
>> seedless reduce.
>>
>> This section:
>>
>> "Just to show how flexible algorithms can be, reduce can also 
>> compute multiple values with one pass through the data (which 
>> is pretty useful for streaming data and would be expensive to 
>> save for a second pass through it). Multiple lambdas produce a 
>> tuple result, here the sum and sum of squares is computed:
>>
>>    int[] arr = [1,2,3,4,5];
>>    auto r = arr.reduce!((a,b) => a + b, (a,b) => a + b * b);
>>    writefln("sum = %s, sum of squares = %s", r[0], r[1]);
>>
>> Which prints: sum = 15, sum of squares = 55"
>>
>> That is the correct answer for the squares sum but only 
>> because 1*1 is 1, what it's really doing here is 1 + (2 * 2) + 
>> (3 * 3) + (4 * 4) + (5 * 5) which happens to work in this case 
>> and for "a + b" and "a - b" but is otherwise broken. The first 
>> element of a seedless reduce does not have any operation 
>> carried out on it.
>>
>> If we change the array to [2,2,2,2,2] we would expect the 
>> squares sum to be 20. It's 18 because the seed element at 
>> arr[0] has no operation carried out on it other than the 
>> addition of the other elements to it.
>
> Pernicious? Bug? I've never used D, but it looks obvious that 
> arr.reduce does what it's compile time parameter promises with 
> 'a' as the "seed". It seems that using [0,1,2,3,4,5] or 
> [0]~[1,2,3,4,5] or ([0]~arr).reduce! would have reflected a 
> more general "sum of squares" idea simply enough.

Alternatively:

     auto r = reduce!((a,b) => a + b, (a,b) => a + b * b) (0, arr);

Regards,
rmr


More information about the Digitalmars-d-announce mailing list