Sorry to dig up this old post, but I wonder if this has been 
solved/addressed in 0.4?

Thanks

On Friday, June 28, 2013 at 12:51:26 AM UTC+1, Kevin Squire wrote:
>
> Short non-answer: if declare something as a typealias with type 
> parameters, you can use it to match types, but (as you've found out) you 
> can't use it as a constructor.
>
> I asked a very related question recently, and the response was that using 
> them as constructors wouldn't be supported.  (I'm still hoping Jeff 
> Bezanson reconsiders, but perhaps it's technically challenging or 
> inefficient.)
>
> https://github.com/JuliaLang/julia/issues/3427
>
> If you don't care about matching types, you can just not declare it as a 
> typealias, and it will look and act like a constructor.
>
> In the issue above, I got around this limitation by the inelegant solution 
> of naming the typealias with an underscore, and creating the function as 
> you did above:
>
> typealias _OrderedDict{K,V} OrderedDictBase{K,V,LinkedDictItem,
> LinkedDictItem}
> OrderedDict(K::Type, V::Type) = OrderedDictBase{K,V,LinkedDictItem,
> LinkedDictItem}()
>
> Kevin
>
> On Thursday, June 27, 2013 2:28:00 PM UTC-7, [email protected] wrote:
>>
>> I have a question regarding the way constructors work in parametric 
>> typealias. Let me sketch using an example.
>> Suppose I started by defining a general pair type:
>> type Pair{T1,T2}
>>     element1::T1
>>     element2::T2
>> end
>>
>> If no special constructor is defined, as in the case above, Julia 
>> provides constructors such that I can create:
>> - pair objects of specified T1 and T2, for example 
>> Pair{Int64,Float64}(a,b), provided that a is some Int64 and b is a Float64
>> - pair objects where T1 and T2 are automatically inferred from the 
>> arguments, i.e. Pair(a,b) will result in an object of type 
>> Pair{typeof(a),typeof(b)}
>>
>> If I define a special inner constructor to replace the constructor of the 
>> first line, I also have to provide an outer constructor that replaces the 
>> functionality of the second line. Is my understanding so far correct?
>>
>> Now I add some aliases to the game. If I define
>> typealias IntPair Pair{Int,Int}
>>
>>
>> then Julia automatically provides a constructor such that I can do
>> IntPair(a,b), which will create an object of type Pair{Int,Int} provided 
>> that a and b are integers
>>
>> Now I define a parametric typealias, such as
>> typealias EqualPair{T} Pair{T,T}
>>
>>
>> then Julia does provide a constructor if I specify the type, i.e. 
>> EqualPair{Int}(a,b) will work if a and b are integers, and returns an 
>> object of type Pair{Int,Int}. However, there is no automatic interference 
>> of the type T if I do not specify it:
>> EqualPair(a,b) returns 
>> "ERROR: type: apply: expected Function, got Type{Pair{T,T}}"
>>
>> And now comes my question: If I now try to define the more general 
>> constructor myself, by writing either
>> EqualPair{T}(a::T,b::T)=Pair{T,T}(a,b)
>> or
>> EqualPair{T}(a::T,b::T)=EqualPair{T}(a,b)
>> I get, in both cases, an error:
>> "ERROR: invalid method definition: not a generic function"
>>
>> How should I then define a constructor for EqualPair that is more general 
>> than the one provided by Julia?
>>
>

Reply via email to