Suppose I have two types, and a Union of those two types. As expected, I
can pass either type in as an argument to a function where the
corresponding function argument is annotated with the Union:
julia> type TypeA; a::Float64; end
julia> type TypeB; a::Float64; b::Float64; end
julia> TypeAorB = Union{TypeA,TypeB}
Union{TypeA,TypeB}
julia> function foo(x::TypeAorB); x.a + 3; end
foo (generic function with 1 method)
julia> a = TypeA(1.5)
TypeA(1.5)
julia> foo(a)
4.5
I can define a function that takes an argument which is an array whose
elements are members of that Union:
julia> function foovec(x::Vector{TypeAorB}); [foo(xi) for xi in x]; end
foovec (generic function with 1 method)
julia> methods(foovec)
# 1 method for generic function "foovec":
foovec(x::Array{Union{TypeA,TypeB},1}) at none:1
However, if I try to pass in any vector whose elements are of TypeA or
TypeB, I get an unexpected (to me at least) failure:
julia> foovec([a,a])
ERROR: MethodError: `foovec` has no method matching foovec(::Array{TypeA,1})
In my real use case, the vectors never mix elements from my two types, so I
can get the behavior that I want using a second Union (of vector types):
julia> TypeAorBvec = Union{Vector{TypeA},Vector{TypeB}}
Union{Array{TypeA,1},Array{TypeB,1}}
julia> function foovec(x::TypeAorBvec); [foo(xi) for xi in x]; end
foovec (generic function with 2 methods)
julia> foovec([a,a])
2-element Array{Float64,1}:
4.5
4.5
But I would like to know why the first example does not work.
An even simpler example: if I define a function with an argument of type
Vector{Any}, then I cannot pass in an array of TypeA, again I get a "no
method matching" error.
--
Please click here
<http://www.e-disclaimer.com/conning/AD21D06B4CC99D2B4F24BA73FB4EED83.htm> for
important information regarding this e-mail communication.