I stumbled over a small thing that surprised me. Assume we have a Szenario where we want to be able to have mutating functions, but we came along with floats. We could just turn them into 0-Arrays using fill(0.0). I was surprised about the following behaviour:
What I am used to do (for arbitrary arrays but here just for 1-dimensional arrays with one element)
julia> 1.0 .* [1.0]
1-element Vector{Float64}:
1.0
julia> 1.0 * [1.0]
1-element Vector{Float64}:
1.0
(or similarly .+ and + when I add two of these.
However when I use fill (0-dim arrays) I get
julia> 1.0 * fill(1.0)
0-dimensional Array{Float64, 0}:
1.0
julia> 1.0 .* fill(1.0) # <-- Why?
1.0
The same happens even for + vs .+ for fill(0.0)s – where especially
julia> fill(0.0) .+ fill(1.0)
1.0
Seems quite surprising to me, I would have expected a 0-dimensioal Array{Float64,0} for both broadcast operations here.
Can someone explain this behaviour?
For the largest context, see this PR, where I try to be able to provide an interface for optimization on the real line (where a user might think in p=1.0 floats and not p=[1.0] arrays)