StaticArrays.jl icon indicating copy to clipboard operation
StaticArrays.jl copied to clipboard

map should work on dimension mismatch cases

Open putianyi889 opened this issue 2 years ago • 3 comments

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

putianyi889 avatar Mar 18 '23 13:03 putianyi889

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

hyrodium avatar Mar 18 '23 15:03 hyrodium

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.

mcabbott avatar Mar 22 '23 12:03 mcabbott

map works for tuples with different lengths by now: JuliaLang/julia#49336

matthias314 avatar Apr 11 '24 22:04 matthias314