Great, thanks!
Dňa utorok, 28. apríla 2015 17:07:27 UTC+2 Tom Breloff napísal(-a):
>
> Yes that's fine
>
> On Tuesday, April 28, 2015 at 10:41:15 AM UTC-4, Ján Dolinský wrote:
>>
>> Thanks for the clarification.
>>
>> If my function foo has more parameters I just go like this ?
>>
>> function foo{V<:VecOrMat}(X::Vector{V}, param1::Int, param2::String)
>> ...
>> end
>>
>> Regards,
>> Jan
>>
>>
>>
>> Dňa utorok, 28. apríla 2015 16:31:37 UTC+2 Tom Breloff napísal(-a):
>>>
>>> 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
>>>>>
>>>>>