# How is reduce function initialized?

**URL:** <https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832>\
**Category:** General Usage\
**Tags:** question\
**Created:** [December 18, 2017, 10:36am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832 "2017-12-18T10:36:32Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [December 18, 2017, 10:36am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/1 "2017-12-18T10:36:32Z")

</div>

Is this normal?

```julia
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.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [December 18, 2017, 10:53am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/2 "2017-12-18T10:53:42Z")

</div>

I am not sure why you expect this. Try

```julia
f(x, y) = x += y < -1 

f(0, 1)
f(0, 2)
# ...

f(1, 2)

```

---

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [December 18, 2017, 10:57am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/3 "2017-12-18T10:57:49Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [December 18, 2017, 11:07am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/4 "2017-12-18T11:07:38Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![yakir12](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yakir12/32/297_2.png) [@yakir12](https://discourse.julialang.org/u/yakir12)\
**Post date:** [December 18, 2017, 11:14am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/5 "2017-12-18T11:14:19Z")

</div>

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 😕

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [December 18, 2017, 11:17am UTC](https://discourse.julialang.org/t/how-is-reduce-function-initialized/7832/6 "2017-12-18T11:17:37Z")

</div>

In that case reduction starts with the first pair:

```julia
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
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

```
