Normally Julia creates the inner and outer constructors for you, but if you 
supply your own inner constructor you need to explicitly supply the outer one 
too:

julia> type Myt{ T<:Real}
           n :: Int64
           chain :: Array{T,1}
           function Myt(n,z::T) 
               x = [z for i=1:n]
               new(n,x)
           end
       end

julia> Myt(5, 3.2f0)
ERROR: no method Myt{T<:Real}(Int64, Float32)

julia> Myt{T}(n::Integer, z::T) = Myt{T}(n,z)
Myt{T<:Real} (constructor with 1 method)

julia> Myt(5, 3.2f0)
Myt{Float32}(5,Float32[3.2,3.2,3.2,3.2,3.2])


The declaration of the outer constructor can be a bit confusing: you might 
say, the LHS and RHS look almost identical, so why do you need it? Here's the 
translation: "given an integer and a value of type T<:Real, construct a Myt{T} 
with those values." You could instead have declared something like

   Myt(n::Integer, z::FloatingPoint) = Myt{Float64}(n,float64(z)),

which you'll see gives you considerable flexibility.

--Tim

On Wednesday, June 11, 2014 08:36:51 AM Florian Oswald wrote:
> hum, good point.
> however, the same applies if I change this:
> 
> type Myt{ T<:Real}
>     n :: Int64
>     chain :: Array{T,1}
>     function Myt(n,z::T)
>         x = [z for i=1:n]
>         new(n,x)
>     end
> end
> 
> or is that not what you meant? I basically want to fill array "chain" with
> several copies of type T.
> 
> On Wednesday, 11 June 2014 16:13:47 UTC+1, John Myles White wrote:
> > Your type’s definition doesn’t seem to depend upon T in any way. Keep in
> > mind that the type is really just the first two lines of your code:
> > 
> > type Myt{T <: Real}
> > 
> >   n::Int64
> >   chain::Array
> > 
> > end
> > 
> > The constructor isn’t part of the type itself, so the dependency on T
> > needs to occur in the type.
> > 
> >  — John
> > 
> > On Jun 11, 2014, at 8:04 AM, Florian Oswald <[email protected]
> > <javascript:>> wrote:
> > 
> > Hi,
> > 
> > I'm trying to understand why this is not working:
> > 
> > type Myt{ T<:Real}
> > 
> >     n :: Int64
> >     chain :: Array
> >     function Myt(n,z::T)
> >     
> >         x = [z for i=1:n]
> >         new(n,x)
> >     
> >     end
> > 
> > end
> > 
> > i get the error
> > julia> Myt(10,18.0)
> > ERROR: no method Myt{T<:Real}(Int64, Float64)
> > 
> > I thought that was very similar to the point example on the manual?
> > 
> > type Point{T<:Real}
> > 
> >   x::T
> >   y::T
> >   
> >   Point(x::T, y::T) = new(x,y)end
> > 
> > thanks

Reply via email to