In 0.4.3, I have defined the following immutable, with a conversion rule to 
permit change the type of the wrapped tuple:

immutable Foo{N,T}
    co::NTuple{N,T}
end

convert{N,T}(::Type{Foo{N,T}}, input::Foo{N}) = Foo( ([T(input.co[i]) for i 
in input.co]...) )

Bar = Foo((1.,2.)) # Returns Foo{2, Float64}((1.0,2.0))

I can explicitly call the convert function:

convert(Foo{2,Float32}, Bar)  Returns Foo{2,Float32}((1.0f0, 2.0f0))

I expected that calling the constructor with the desired parameters would 
achieve the same, but in fact I receive an error:

Foo{2,Float32}(Bar) # ERROR: MethodError: `convert` has no method matching 
convert(::Type{Tuple{Float32,Float32}}, ::Foo{2,Float64})

I do not understand why Julia is dispatching to convert with an argument of 
::Type{Tuple{Float32,Float32}}, instead of ::Type{Foo{2,Float32}}, can 
someone shed some light on what's going on?

Regards,

Sam.

Reply via email to