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 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), 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 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), 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 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), 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 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), 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...
```