On Mon, 2016-09-12 at 16:07, Yichao Yu wrote:
> On Mon, Sep 12, 2016 at 9:52 AM, Neal Becker wrote:
>
>> Taking the following example:
>>
>> type Point{T<:Real}
>> x::T
>> y::T
>> end
>>
>> I can construct a Point taking the type "T" from the argument types.
>> Or I can explicity specify the type
>>
>> Point{Int32}(2,2)
>>
>> But I'd like to be able to specify a default type:
>>
>> type Point{T<:Real=Int32}
>>
>> for example, so that an unqualified
>> Point(2,2)
>>
>> would produce Point{Int32}, while still allowing explicity
>> Point{Int64}(2,2)
>>
>
> Overload `Point` to do exactly that.
>
> `Point(x, y) = Point{Int32}(x, y)`
>
> Note that having types as first class object (different from c++) we can't
> have default type parameters at type level since we need the `Point` in
> `Point` and `Point{Int64}` to mean exactly the same thing.
This actually doesn't work because the default constructor is more
specific for (Int,Int) arguments:
Providing this constructor works:
Point{T<:Real}(x::T,y::T) = Point{Int32}(x,y)
Note, this is quite fiddly as these don't work:
Point(x,y) = Point{Int32}(x,y)
Point{T}(x::T,y::T) = Point{Int32}(x,y)
as the default constructor has the signature Point{T<:Real}(x::T,y::T)
which is more specific than above two non-working functions.
Depending on your needs, you can also add above catch-all:
Point(x,y) = Point{Int32}(x,y)
then this works too:
julia> Point(4,5.)
Point{Int32}(4,5)