Is this normal?

```
julia> a = reduce(0, 1:4) do x,y
x += y < -1
end
0
julia> a = reduce(1:4) do x,y
x += y < -1
end
1
```

I’d expect both to result in zero.

Is this normal?

```
julia> a = reduce(0, 1:4) do x,y
x += y < -1
end
0
julia> a = reduce(1:4) do x,y
x += y < -1
end
1
```

I’d expect both to result in zero.

I am not sure why you expect this. Try

```
f(x, y) = x += y < -1
f(0, 1)
f(0, 2)
# ...
f(1, 2)
```

Oh, I understand my problem here, I thought that the initial value of reduce defaults to zero when it’s omitted from the function call. But it’s set to the first element of the iterable, right?

See `?reduce`

:

It is unspecified whether

`v0`

is used for non-empty collections.

Ideally, `v0`

is a “neutral element”, so it should not matter. But this does not hold in your case.

I have to admit that even after reading reduce’s help and your reply, I just don’t understand what the initial value is set to when it’s omitted from the function call

In that case reduction starts with the first pair:

```
julia> function f(x, y)
println("called with $x and $y")
x + y
end
f (generic function with 2 methods)
julia> reduce(f, 1:4)
called with 1 and 2
called with 3 and 3
called with 6 and 4
10
```

But as stated in the docstring, this won’t work for empty collections:

```
julia> reduce(f, [])
ERROR: ArgumentError: reducing over an empty collection is not allowed
Stacktrace:
[1] _mapreduce(::Base.#identity, ::#f, ::IndexLinear, ::Array{Any,1}) at ./reduce.jl:265
[2] reduce(::Function, ::Array{Any,1}) at ./reduce.jl:330
```