The reason is a little subtle, but it's because you have an abstract type inside a parametric type, which confuses Julia. When you annotate a::MyAbstractType, julia understands what to do with it (i.e. compiles functions for each concrete subtype). When you annotate a::Vector{MyAbstractType}, it is expecting a concrete type Vector{MyAbstractType}, but you are in fact passing it a different concrete type Vector{MyConcreteType}. Use the signature that Tim suggested to get around the issue.
On Tuesday, April 28, 2015 at 10:08:57 AM UTC-4, Ján Dolinský wrote: > > Hi Tim, > > Thanks for the tip. Very interesting. In function definition it works. I > read the parametric-composite-types manual. I am still puzzled however. > > Consider the example below which works as I expect: > > a = rand(10) > b = rand(10,2) > > julia> a :: VecOrMat{Float64} > 10-element Array{Float64,1}: > ... > > julia> b :: VecOrMat{Float64} > 10x2 Array{Float64,2}: > ... > > > The following example does not work as I would expect: > > a = Vector{Float64}[rand(10), rand(10)] > b = Matrix{Float64}[rand(10,2), rand(10,2)] > > julia> a :: Vector{VecOrMat{Float64}} > ERROR: type: typeassert: expected > Array{Union(Array{Float64,1},Array{Float64,2}),1}, got > Array{Array{Float64,1},1} > > julia> b :: Vector{VecOrMat{Float64}} > ERROR: type: typeassert: expected > Array{Union(Array{Float64,1},Array{Float64,2}),1}, got > Array{Array{Float64,2},1} > > however, this: > julia> a :: Vector{Vector{Float64}} > 2-element Array{Array{Float64,1},1}: > ... > and this works: > julia> b :: Vector{Matrix{Float64}} > 2-element Array{Array{Float64,2},1}: > ... > > Thanks, > Jan > > > > Dňa utorok, 28. apríla 2015 13:13:36 UTC+2 Tim Holy napísal(-a): >> >> >> http://docs.julialang.org/en/release-0.3/manual/types/#parametric-composite-types >> >> >> Use foo{V<:VecOrMat}(X::Vector{V}) >> >> --Tim >> >> On Tuesday, April 28, 2015 02:40:41 AM Ján Dolinský wrote: >> > Hi guys, >> > >> > I am trying to write a function which accepts as an input either a >> vector >> > of vectors or a vector of matrices e.g. >> > >> > function foo(X::Vector{VecOrMat{Float64}}) >> > >> > When running the function with a vector of matrices I get the following >> > error " 'foo' has no method matching foo(::Array{Array{Float64,2},1})" >> > >> > Am I missing something here ? >> > >> > Thanks, >> > Jan >> >>