On Julia 1.1:
julia> cumsum(Union{}[])
ERROR: MethodError: Base.ArithmeticStyle(::Type{Union{}}) is ambiguous. Candidates:
Base.ArithmeticStyle(::Type{#s72} where #s72<:Integer) in Base at traits.jl:21
Base.ArithmeticStyle(::Type{#s623} where #s623<:Dates.AbstractTime) in Dates at /Users/osx/buildbot/slave/package_osx64/build/usr/share/julia/stdlib/v1.1/Dates/src/types.jl:392
Base.ArithmeticStyle(::Type{#s72} where #s72<:AbstractFloat) in Base at traits.jl:20
Possible fix, define
Base.ArithmeticStyle(::Type{Union{}})
Stacktrace:
[1] #cumsum!#581(::Int64, ::Function, ::Array{Union{},1}, ::Array{Union{},1}) at ./accumulate.jl:51
[2] (::getfield(Base, Symbol("#kw##cumsum!")))(::NamedTuple{(:dims,),Tuple{Int64}}, ::typeof(cumsum!), ::Array{Union{},1}, ::Array{Union{},1}) at ./none:0
[3] #cumsum#582(::Int64, ::Function, ::Array{Union{},1}) at ./accumulate.jl:91
[4] (::getfield(Base, Symbol("#kw##cumsum")))(::NamedTuple{(:dims,),Tuple{Int64}}, ::typeof(cumsum), ::Array{Union{},1}) at ./none:0
[5] cumsum(::Array{Union{},1}) at ./accumulate.jl:116
[6] top-level scope at none:0
I got here from a special case of a function that takes the cumulative sum of the lengths of the entries in a NamedTuple
, except the tuple was empty:
julia> [length(x) for x in NamedTuple()]
0-element Array{Union{},1}
The error could certainly be improved, but what result would you expect other than an error? sum(Union{}[])
also throws. In your case, better do Int[length(x) for x in NamedTuple()]
.
Arguably, cumsum(Union{}[])
could return Union{}[]
. We can infer +(Union{}, Union{})
as Union{}
, so we know the element type, and we know the length. We cannot compute any element values, but luckily, we don't need any. That differs from sum(Union{}[])
, where we do need one value.
Seems like an easy fix, no?
julia> @eval Base ArithmeticStyle(::Type{Union{}}) = ArithmeticUnknown()
Base.ArithmeticStyle
julia> cumsum(Union{}[])
0-element Array{Union{},1}
Most helpful comment
Arguably,
cumsum(Union{}[])
could returnUnion{}[]
. We can infer+(Union{}, Union{})
asUnion{}
, so we know the element type, and we know the length. We cannot compute any element values, but luckily, we don't need any. That differs fromsum(Union{}[])
, where we do need one value.