Yes, you can overload the call operator for arbitrary types.

On Mon, Dec 7, 2015 at 6:44 PM, Davide Lasagna <lasagnadav...@gmail.com>
wrote:

> 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, juthoh...@gmail.com 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