StaticArrays.jl
StaticArrays.jl copied to clipboard
map should work on dimension mismatch cases
julia> map(+,[1,2,3],1:4)
3-element Vector{Int64}:
2
4
6
julia> map(+,SVector(1,2,3),1:4)
ERROR: DimensionMismatch: Sizes (Size(3,), (4,)) of input arrays do not match
Stacktrace:
[1] _throw_size_mismatch(::SVector{3, Int64}, ::Vararg{Any})
@ StaticArrays C:\Users\pty\.julia\packages\StaticArrays\4WE4t\src\traits.jl:116
[2] same_size
@ C:\Users\pty\.julia\packages\StaticArrays\4WE4t\src\traits.jl:110 [inlined]
[3] macro expansion
@ C:\Users\pty\.julia\packages\StaticArrays\4WE4t\src\mapreduce.jl:74 [inlined]
[4] _map(::typeof(+), ::SVector{3, Int64}, ::UnitRange{Int64})
@ StaticArrays C:\Users\pty\.julia\packages\StaticArrays\4WE4t\src\mapreduce.jl:40
[5] map(f::Function, a1::SVector{3, Int64}, as::UnitRange{Int64})
@ StaticArrays C:\Users\pty\.julia\packages\StaticArrays\4WE4t\src\mapreduce.jl:31
[6] top-level scope
@ REPL[14]:1
I did not know that map works on dimension mismatch cases.
I think map(+,SVector(1,2,3),1:2) should throw an error to keep type-stability, so supporting dimension mismatch case would be partial and incomplete.
julia> using StaticArrays
julia> map(+,SVector(1,2,3),1:4) # The output can be SVector(2,4,6)
ERROR: DimensionMismatch: Sizes (Size(3,), (4,)) of input arrays do not match
Stacktrace:
[1] _throw_size_mismatch(::SVector{3, Int64}, ::Vararg{Any})
@ StaticArrays ~/.julia/dev/StaticArrays/src/traits.jl:113
[2] same_size
@ ~/.julia/dev/StaticArrays/src/traits.jl:107 [inlined]
[3] macro expansion
@ ~/.julia/dev/StaticArrays/src/mapreduce.jl:74 [inlined]
[4] _map(::typeof(+), ::SVector{3, Int64}, ::UnitRange{Int64})
@ StaticArrays ~/.julia/dev/StaticArrays/src/mapreduce.jl:40
[5] map(f::Function, a1::SVector{3, Int64}, as::UnitRange{Int64})
@ StaticArrays ~/.julia/dev/StaticArrays/src/mapreduce.jl:31
[6] top-level scope
@ REPL[2]:1
julia> map(+,SVector(1,2,3),1:2) # The output cannot be SVector(2,4) or [2,4] for type-stability
ERROR: DimensionMismatch: Sizes (Size(3,), (2,)) of input arrays do not match
Stacktrace:
[1] _throw_size_mismatch(::SVector{3, Int64}, ::Vararg{Any})
@ StaticArrays ~/.julia/dev/StaticArrays/src/traits.jl:113
[2] same_size
@ ~/.julia/dev/StaticArrays/src/traits.jl:107 [inlined]
[3] macro expansion
@ ~/.julia/dev/StaticArrays/src/mapreduce.jl:74 [inlined]
[4] _map(::typeof(+), ::SVector{3, Int64}, ::UnitRange{Int64})
@ StaticArrays ~/.julia/dev/StaticArrays/src/mapreduce.jl:40
[5] map(f::Function, a1::SVector{3, Int64}, as::UnitRange{Int64})
@ StaticArrays ~/.julia/dev/StaticArrays/src/mapreduce.jl:31
[6] top-level scope
@ REPL[3]:1
I did not know that map works on dimension mismatch cases.
This was added at some point, I think Julia 1.5, perhaps by accident. It also doesn't work for map on tuples: https://github.com/JuliaLang/julia/issues/42216
map(+,SVector(1,2,3),1:2)should throw an error to keep type-stability
Good point.
map works for tuples with different lengths by now: JuliaLang/julia#49336