# Sum(i for i in Vector{Int}()) raises error instead of returning 0?

**URL:** <https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705>\
**Category:** General Usage\
**Tags:** question, proposal\
**Created:** [January 26, 2017, 6:15pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705 "2017-01-26T18:15:30Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)\
**Post date:** [January 26, 2017, 6:15pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/1 "2017-01-26T18:15:31Z")

</div>

```julia
sum(i for i in Vector{Int}())

```

raises an error:

> ERROR: MethodError: no method matching zero(::Type{Any})  
> Closest candidates are:  
> zero(::Type{Base.LibGit2.Oid}) at libgit2/oid.jl:88  
> zero(::Type{Base.Pkg.Resolve.VersionWeights.VWPreBuildItem}) at pkg/resolve/versionweight.jl:80  
> zero(::Type{Base.Pkg.Resolve.VersionWeights.VWPreBuild}) at pkg/resolve/versionweight.jl:120  
> …  
> in mr\_empty(::Base.#identity, ::Base.#+, ::Type{T}) at ./reduce.jl:130  
> in mapfoldl(::Base.#identity, ::Function, ::Base.Generator{Array{Int64,1},##11#12}) at ./reduce.jl:60  
> in sum(::Base.Generator{Array{Int64,1},##11#12}) at ./reduce.jl:229

Why can’t `sum` infer that the type is `Int`, and return an integer 0?  
(The mathematical definition of an empty sum is 0)

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [January 26, 2017, 6:48pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/2 "2017-01-26T18:48:57Z")

</div>

See also the related issue [https://github.com/JuliaLang/julia/issues/18695](https://github.com/JuliaLang/julia/issues/18695) and [https://github.com/JuliaLang/julia/issues/18645](https://github.com/JuliaLang/julia/issues/18645)

---

<div class="post-metadata">

**Author:** ![cstjean](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/cstjean/32/1444_2.png) [@cstjean](https://discourse.julialang.org/u/cstjean)\
**Post date:** [January 26, 2017, 9:32pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/3 "2017-01-26T21:32:24Z")

</div>

Is there / shouldn’t there be a way to specify the eltype of a generator? What’s the equivalent of `sum(Int[i for i in Vector{Int}()])`

---

<div class="post-metadata">

**Author:** ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)\
**Post date:** [January 27, 2017, 2:27pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/4 "2017-01-27T14:27:34Z")

</div>

Something like

```julia
sum(f(x)::Int for x in Vector())

```

should tell the compiler that the generator’s eltype is an `Int`. Currently it raises the same error (julia v0.5.0).

---

<div class="post-metadata">

**Author:** ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)\
**Post date:** [November 14, 2017, 1:53pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/5 "2017-11-14T13:53:53Z")

</div>

I defined a “safe sum” that guarantees a return type and returns the correct 0 for empty iterators:

```julia
function sumf(::Type{T}, itr)::T where T
    isempty(itr) ? zero(T) : sum(x::T for x in itr)::T
end

```

Perhaps this should be added as a method to `Base.sum`?

---

<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:** [November 14, 2017, 2:18pm UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/6 "2017-11-14T14:18:47Z")

</div>

Note that while it may be useful, adding it to `sum` would conflict with the existing `sum(::Union{Function, Type}, ::Any)` method.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [November 30, 2017, 2:56am UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/7 "2017-11-30T02:56:15Z")

</div>

You can always call `reduce` instead.

---

<div class="post-metadata">

**Author:** ![e3c6](https://avatars.discourse-cdn.com/v4/letter/e/e79b87/32.png) [@e3c6](https://discourse.julialang.org/u/e3c6)\
**Post date:** [June 25, 2018, 11:15am UTC](https://discourse.julialang.org/t/sum-i-for-i-in-vector-int-raises-error-instead-of-returning-0/1705/8 "2018-06-25T11:15:49Z")

</div>

[https://github.com/JuliaLang/julia/issues/27766](https://github.com/JuliaLang/julia/issues/27766)
