I don’t see how z::T and z(“hi”) can both make sense. Do you perhaps mean 
z::Type{T}?

 — John

On Jun 11, 2014, at 9:34 AM, Florian Oswald <[email protected]> wrote:

> Sorry guys but I have to come back to this. My problem is slightly more 
> involved than the initial example, in the sense that in the array I want to 
> construct another custom type (let's call it my subtype here):
> 
> abstract MyAbstract
> 
> type MySubType <: MyAbstract
>     field1 :: ASCIIString
>     function MySubType(x)
>         new(x)
>     end
> end
> 
> 
> type Myt{ T<:MyAbstract}
>     chain :: Array{T,1}
>     function Myt(n,z::T) 
>         x = [z("hi") for i=1:n]
>         new(x)
>     end
> end
> Myt{T}(n::Integer,z::T) = Myt{T}(n,z)
> 
> trying to construct Myt gives
> 
> Myt(10,MySubType)
> ERROR: type: Myt: in T, expected T<:MyAbstract, got Type{DataType}
> 
> How would you do this? 
> thanks!
> 
> 
> On Wednesday, 11 June 2014 17:00:13 UTC+1, Tim Holy wrote:
> 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