I remember getting caught on this, as well. I think I had to read the
section on Parametric
Constructors<http://docs.julialang.org/en/latest/manual/constructors/#parametric-constructors>
in
the docs about 5 times before finally understanding it. Basically, the
implicit constructor is the same as defining the following inner *and*
outer constructors:
type Point{T<:Real}
x::T
y::T
Point(x::T, y::T) = new(x,y)
end
Point{T<:Real}(x::T, y::T) = Point{T}(x,y)
If you define any custom inner constructors yourself, the outer constructor
is no longer automatically defined for you. There are quite a few very
fine semantic points about *why* this kind of definition is required. I
still have to re-read that section every now and again to remind myself.
But I don't think I can say it any better myself, at least not yet.
On Monday, April 21, 2014 3:47:40 PM UTC-4, Spencer Lyon wrote:
>
> I am having issues defining constructors for parametric types. I’lll
> borrow an example from the docs to illustrate my issue:
>
> Say I define this type:
>
> type Point1{T}
> x::T
> y::T
> end
>
> I can then create an object of this type in many ways
>
> julia> Point1(1.0, 2.0)
> Point1{Float64}(1.0,2.0)
>
> julia> Point1(1, 2)
> Point1{Int64}(1,2)
>
> julia> Point1("1", "2")
> Point1{ASCIIString}("1","2")
>
> julia> Point1('1', '2')
> Point1{Char}('1','2')
>
> julia> methods(Point1)
> # 1 method for generic function "Point1":
> Point1{T}(x::T,y::T)
>
> # ect...
>
> My question is how can I manually define the constructor for this
> Parametric type?
>
> To illustrate my issue, I tried to define a second type Point2 with the
> same fields. After reading the documentation sections on types, methods,
> and constructors I thought that I might be able to define the inner
> constructor as Point2(x, y) = new(x, y) as follows:
>
> type Point2{T}
> x::T
> y::T
>
> Point2(x, y) = new(x, y)
> end
>
> However, this does not work:
>
> julia> Point2(1.0, 2.0)
> ERROR: no method Point2{T}(Float64, Float64)
>
> julia> methods(Point2)
> # 0 methods for generic function "Point2":
>
> I thought maybe I needed to include the paramter T in the constructor,
> but this doesn’t work either:
>
> type Point2{T}
> x::T
> y::T
>
> Point2{T}(x, y) = new(x, y)
> end
>
> It is odd, however, that if I pass in a DataType when calling my
> Point2constructor it does work. For example:
>
> julia> Point2{Float64}(1.0, 2.0)
> Point2{Float64}(1.0,2.0)
>
>