I am trying to write two functions with same name that can make use of multiple dispatch facility of Julia and involved Arrays and Arrays of Array.
Suppose there are these three input variables
# typeof(a) => Array{Array{T,N},1}
a=Array[[1,2,3],[4,5,6]]
# typeof(b) => Array{Int64,1}
b=[1,2,3]
# typeof(c) => Array{Array{Float64,1},1}
c=[rand(10) for i in 1:2]
And I write the two functions like this
function test(x::Array{Array})
println("received an array of array => $(typeof(x))")
end
function test{T<:Number}(x::Array{T,1})
println("received a vector. converting.....")
nx = Array[x]
test(nx)
end
The above approach works for a
and b
but not c
.
test(a)
# received an array of array => Array{Array{T,N},1}
test(b)
# received a vector. converting.....
# received an array of array => Array{Array{T,N},1}
test(c)
# LoadError: MethodError: `test` has no method matching test(::Array{Array{Float64,1},1})
# while loading In[37], in expression starting on line 1
Now if I change the function definition to x::Array{Array{Float64,1},1}
this would work. But my question is isn't Array{Array}
supposed to take any kind of Arrays of Array?
How should one work with inner type parameter on an array of arrays?
is isn't Array{Array} supposed to take any kind of Arrays of Array?
yes and no... it is supposed to but not in this way.
i guess you've already known that Julia’s type parameters are invariant.
note that Array
itself is a parametric type, so you should use Array{T}
where T<:Array
instead of Array{Array}
:
function test{T<:Array}(x::Array{T})
println("received an array of array => $(typeof(x))")
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With