Search
Why does sum not work in static arrays?
Dec 06, 2015
Tim K.
Dec 06, 2015
drug
Dec 06, 2015
cym13
Dec 06, 2015
Tim K.
Oct 10
mw
Hi! I have the following code:

int main(string[] argv)
{
import std.algorithm: sum;
import std.stdio: writeln;

uint[3] a1 = [1, 2, 3];
uint[] a2;
for (int i = 1; i <= 3; ++i)
a2 ~= i;

writeln("a1: ", sum(a1));
writeln("a2: ", sum(a2));
return 0;
}

This throws the error:
dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are:
/usr/include/dmd/phobos/std/algorithm/iteration.d(3916):        std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)))
/usr/include/dmd/phobos/std/algorithm/iteration.d(3927):        std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front)))

So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays?

Regards
06.12.2015 15:23, Tim K. пишет:
> Hi! I have the following code:
>
>      int main(string[] argv)
>      {
>          import std.algorithm: sum;
>          import std.stdio: writeln;
>
>          uint[3] a1 = [1, 2, 3];
>          uint[] a2;
>          for (int i = 1; i <= 3; ++i)
>              a2 ~= i;
>
>          writeln("a1: ", sum(a1));
>          writeln("a2: ", sum(a2));
>          return 0;
>      }
>
> This throws the error:
> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce
> function from argument types !()(uint[3]), candidates are:
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916):
> std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R
> && is(typeof(r.front + r.front)))
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927):
> std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R &&
> !isInfinite!R && is(typeof(seed = seed + r.front)))
>
>
> So a dynamic array works just fine. In fact, if I uncomment the line in
> question the program compiles and outputs the correct value (for a2).
> Why does "sum" not work on static arrays?
>
>
> Regards
Because static array aren't ranges, but dynamic ones are. Try this:
writeln("a1" ", sum (a1[])); // using [] makes static array to be a range
On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote:
> Hi! I have the following code:
>
>     int main(string[] argv)
>     {
>         import std.algorithm: sum;
>         import std.stdio: writeln;
>
>         uint[3] a1 = [1, 2, 3];
>         uint[] a2;
>         for (int i = 1; i <= 3; ++i)
>             a2 ~= i;
>
>         writeln("a1: ", sum(a1));
>         writeln("a2: ", sum(a2));
>         return 0;
>     }
>
> This throws the error:
> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are:
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916):        std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)))
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927):        std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front)))
>
>
> So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays?
>
>
> Regards

So that you do not shoot yourself in the foot too easily. A static array is a value type so it is passed by value to functions. If you pass a 1M array to a function... well, I guesse you don't want to do that.

The solution is to slice it:   a1[].sum;   That way you avoid the problem.
On Sunday, 6 December 2015 at 12:27:49 UTC, cym13 wrote:
> A static array is a value type so it is passed by value to functions.

Oh, right, I totally forgot about that. Thank you for reminding me.
And yes, I was not planning on doing that. I just have a local fixed-size array that I wanted to get the sum of...

> The solution is to slice it:   a1[].sum;   That way you avoid the problem.

Thank you two.

Regards
On Sunday, 6 December 2015 at 12:27:49 UTC, cym13 wrote:
> On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote:
>> Hi! I have the following code:
>>
>>     int main(string[] argv)
>>     {
>>         import std.algorithm: sum;
>>         import std.stdio: writeln;
>>
>>         uint[3] a1 = [1, 2, 3];
>>         uint[] a2;
>>         for (int i = 1; i <= 3; ++i)
>>             a2 ~= i;
>>
>>         writeln("a1: ", sum(a1));
>>         writeln("a2: ", sum(a2));
>>         return 0;
>>     }
>>
>> This throws the error:
>> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are:
>> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916):
>>  std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)))
>> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927):
>>  std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front)))
>>
>>
>> So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays?
>>
>>
>> Regards
>
> So that you do not shoot yourself in the foot too easily. A static array is a value type so it is passed by value to functions. If you pass a 1M array to a function... well, I guesse you don't want to do that.

Can the template func `sum()` be made to take `ref` of a static array?

> The solution is to slice it:   a1[].sum;   That way you avoid the problem.

While I understand the explanation of the current behavior, and the work-around, this inconstancy of making func calls means either the library, or the language leaves something to be desired: i.e

dynamic array and static array cannot be used interchangeably: (sure I'm not talking about array decl / allocation, the user have to take different actions) I'm talking about a simple function call to calc the sum of the array.
```
sum(static_array[]);   // v.s.
sum(dynamic_array);
```

For example, if the user first decl a static array for fast prototyping, and later changed mind to use dynamic array, then s/he need to change the call all over the places.

(I hope you are not telling me, every time people should use:
```
array_func(any_array[]);
```
is the correct D-idiom to use array in a func call)

Sidenote, sort also not works with static arrays.

On Sun, Oct 11, 2020 at 01:26:13PM +0000, Alaindevos via Digitalmars-d-learn wrote:
> Sidenote, sort also not works with static arrays.

Just slice it with [].

T

--
I think the conspiracy theorists are out to get us...