I created another issue for my question., so I guess any more followups 
should go to the issue discussion rather than this forum.

https://github.com/JuliaLang/julia/issues/8625

-- Steve


On Tuesday, October 7, 2014 4:11:31 PM UTC-4, Jutho wrote:
>
> There are some open issues with type alias , maybe this is related.
> See e.g.
> https://github.com/JuliaLang/julia/issues/6721
>
>
> Op dinsdag 7 oktober 2014 19:20:42 UTC+2 schreef [email protected]:
>>
>> Leah-- that is very helpful, thanks! 
>>
>> I rewrote the code testnestparam with parameters everywhere (see below), 
>> and now it works. It does not work, however, if I define test0(i::SDToken) 
>> = nothing (method not found error).  I don't understand why that is.  Isn't 
>> any instance of SDToken{K,D} for a specific choice {K,D} a subtype of 
>> abstract unparametrized SDToken?   In this case, why can't Julia match 
>> test0 when it is unparametrized?
>>
>> More generally, is there a writeup on parametrized types that goes into 
>> more detail than the manual and has many examples?  I keep making mistakes 
>> with them because my understanding is incomplete.
>>
>> Thanks,
>> Steve
>>
>> module testnestparam
>>
>> immutable IntSemiToken
>>     address::Int
>> end
>>
>> immutable Token{T, S}
>>     container::T
>>     semitoken::S
>> end
>>
>> # take a token apart
>> semi(i::Token) = i.semitoken
>> container(i::Token) = i.container
>>
>> # put a token back together
>> assemble(m, s) = Token(m,s)
>>
>> type SortedDict{K, D} <: Associative{K,D}
>>     bt::Dict{K,D}
>> end
>>
>> typealias SDToken{K,D} Token{SortedDict{K,D}, IntSemiToken}
>>
>> sdtoken_construct{K,D}(m::SortedDict{K,D}, int1::Int) = 
>>     SDToken{K,D}(m, IntSemiToken(int1))
>>
>> test0{K,D}(i::SDToken{K,D}) = nothing
>> # test0(i::SDToken) = nothing  # This variant fails.  Why?
>>
>> function test1()
>>     s = SortedDict([1=>"a",2=>"b"])
>>     t = sdtoken_construct(s, 0)
>>     t2 = assemble(t.container, t.semitoken)
>>     println("typeof(t) = ", typeof(t))
>>     println("typeof(t2) = ", typeof(t2))
>>     println("methods(test0) = ", methods(test0))
>>     test0(t)
>>     test0(t2) 
>> end
>>
>> end
>>
>>
>>
>>
>>
>>
>> On Tuesday, October 7, 2014 12:58:30 PM UTC-4, Leah Hanson wrote:
>>>
>>> You need to fully specify TDict when using it's constructor:
>>>
>>> ~~~
>>> julia> module testnestparam2
>>>
>>>        immutable Token{S,T}
>>>            m::S
>>>            t::T
>>>        end
>>>
>>>        typealias TDict{K,D} Token{Dict{K,D}, Int}
>>>
>>>        function makeADict()
>>>            a = TDict{Int64,String}([1=>"a",2=>"c"], 5)
>>>        end
>>>
>>>        end
>>> Warning: replacing module testnestparam2
>>>
>>> julia> testnestparam2.makeADict()
>>> Token{Dict{Int64,String},Int64}([2=>"c",1=>"a"],5)
>>> ~~~
>>>
>>> On Tue, Oct 7, 2014 at 11:41 AM, <[email protected]> wrote:
>>>
>>>> Oops, sorry, in my last posting there was obviously an error in my code 
>>>> because I used the wrong syntax to call an array constructor.  Here is 
>>>> another example where now I am using the correct constructor syntax (I 
>>>> think?).  But I still get the same error message concerning 'apply'.
>>>>
>>>> module testnestparam2
>>>>
>>>> immutable Token{S,T}
>>>>     m::S
>>>>     t::T
>>>> end
>>>>
>>>> typealias TDict{K,D} Token{Dict{K,D}, Int}
>>>>
>>>> function makeADict()
>>>>     a = TDict([1=>"a",2=>"c"], 5)
>>>> end
>>>>
>>>> end
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Tuesday, October 7, 2014 12:29:49 PM UTC-4, [email protected] 
>>>> wrote:
>>>>>
>>>>> Here is a very short Julia code that gives a mysterious error message 
>>>>> in the latest build (952).  Is it an error in my code or a bug in Julia? 
>>>>>  (In addition to the answer to this question, I would also like help with 
>>>>> the code design question in my previous posting of two hours ago.)
>>>>>
>>>>> Thanks,
>>>>> Steve
>>>>>
>>>>> module testnestparam2
>>>>>
>>>>> typealias ADict{K,D} Array{Dict{K,D},1}
>>>>>
>>>>> function makeADict()
>>>>>     a = ADict([[-9=>"a"],[15=>"b"]]) #line 6
>>>>>     println("a[1][-9] = ", a[1][-9])
>>>>> end
>>>>>
>>>>> end
>>>>>
>>>>> julia> testnestparam2.makeADict()
>>>>> ERROR: type: makeADict: in apply, expected Function, got 
>>>>> Type{Array{Dict{K,D},1
>>>>> }
>>>>>  in makeADict at c:\Users\vavasis\Documents\Projects\qmg21\julia\
>>>>> testnestparam2
>>>>> jl:6
>>>>>
>>>>>
>>>>>
>>>>> On Tuesday, October 7, 2014 10:05:09 AM UTC-4, [email protected] 
>>>>> wrote:
>>>>>>
>>>>>> Thanks for the explanation!  Although I think I understand your 
>>>>>> answer, I'm not sure how to define the types to accomplish my goal.
>>>>>>
>>>>>> * a Token should have two parts, a container and a semitoken, both 
>>>>>> abstract
>>>>>>
>>>>>> * an SDToken should be a specialization of Token in which the 
>>>>>> container portion is SortedDict{K,D} for a specific K,D and the 
>>>>>> semitoken 
>>>>>> portion is IntSemiToken (both parts concrete)
>>>>>>
>>>>>> * Some functions take SDToken's as input.  These should be generic, 
>>>>>> i.e., work for all choices of K,D.
>>>>>>
>>>>>> * There are also generic functions that return SDTokens as output (in 
>>>>>> which K and D are determined from the input args).
>>>>>>
>>>>>> Can I write typealias SDToken{K,D} Token{SortedDict{K,D},IntSemiToken}?  
>>>>>> I tried this and got an unexpected error message:
>>>>>>
>>>>>> ERROR: type: test1: in apply, expected Function, got 
>>>>>> Type{Token{SortedDict{K,D},
>>>>>> IntSemiToken}}
>>>>>>  in test1 at c:\Users\vavasis\Documents\Projects\qmg21\julia\
>>>>>> testnestparam.jl:32
>>>>>>
>>>>>> (No 'apply' in my code!)  And in any case, even if I could write 
>>>>>> this, I'm not sure it solves the problem.
>>>>>>
>>>>>> -- Steve
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Tuesday, October 7, 2014 2:15:01 AM UTC-4, Jutho wrote:
>>>>>>>
>>>>>>> I don't see the problem regarding point one.
>>>>>>>
>>>>>>> A type with parameters, as your SortedDict{D,K}, becomes an abstract 
>>>>>>> type when the parameters are unspecified, e.g. SortedDict, but this is 
>>>>>>> indeed printed/formatted with unspecified parameters put back (I guess 
>>>>>>> with 
>>>>>>> the name as you defined them), e.g. as SortedDict{D,K}.
>>>>>>>
>>>>>>> Regarding point 2, this relates to the invariance of parametric 
>>>>>>> types. 
>>>>>>>
>>>>>>> isa(t2,Token{SortedDict, IntSemiToken})
>>>>>>> will return false, because
>>>>>>> Token{SortedDict{Int64,ASCIIString},IntSemiToken} <: 
>>>>>>> Token{SortedDict, IntSemiToken}
>>>>>>> is false. There are many discussions regarding this both on the 
>>>>>>> forum and I guess in the manual. Search for invariance versus 
>>>>>>> covariance of 
>>>>>>> parametric types.
>>>>>>>
>>>>>>>
>>>>>>> Op dinsdag 7 oktober 2014 04:42:12 UTC+2 schreef [email protected]
>>>>>>> :
>>>>>>>>
>>>>>>>> The code below is an excerpt from a more complicated code I am 
>>>>>>>> writing.  It contains a parametrized type in which the parameter is 
>>>>>>>> itself 
>>>>>>>> another parametrized type. I have attached the printout 
>>>>>>>> (0.4.0-dev+323).  
>>>>>>>> Notice the error message at the end.  My questions are:
>>>>>>>>
>>>>>>>> (1) How is it possible that the type of t includes dummy parameters 
>>>>>>>> K and D, which aren't real types at all?
>>>>>>>>
>>>>>>>> (2) Why is Julia not able to match t2 but it is able to match t to 
>>>>>>>> the signature of test0()?  
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Steve Vavasis
>>>>>>>>
>>>>>>>>
>>>>>>>> julia> testnestparam.test1()
>>>>>>>> typeof(t) = Token{SortedDict{K,D},IntSemiToken}
>>>>>>>> typeof(t2) = Token{SortedDict{Int64,ASCIIString},IntSemiToken}
>>>>>>>> methods(test0) = # 1 method for generic function "test0":
>>>>>>>> test0(i::Token{SortedDict{K,D},IntSemiToken}) at 
>>>>>>>> c:\Users\vavasis\Documents\Projects\qmg21\julia\testnestparam.jl:28
>>>>>>>> ERROR: `test0` has no method matching test0(::Token{SortedDict{
>>>>>>>> Int64,ASCIIString},IntSemiToken})
>>>>>>>>  in test1 at c:\Users\vavasis\Documents\Projects\qmg21\julia\
>>>>>>>> testnestparam.jl:38
>>>>>>>>
>>>>>>>>
>>>>>>>> module testnestparam
>>>>>>>>
>>>>>>>> immutable IntSemiToken
>>>>>>>>     address::Int
>>>>>>>> end
>>>>>>>>
>>>>>>>> immutable Token{T, S}
>>>>>>>>     container::T
>>>>>>>>     semitoken::S
>>>>>>>> end
>>>>>>>>
>>>>>>>> # take a token apart
>>>>>>>> semi(i::Token) = i.semitoken
>>>>>>>> container(i::Token) = i.container
>>>>>>>>
>>>>>>>> # put a token back together
>>>>>>>> assemble(m, s) = Token(m,s)
>>>>>>>>
>>>>>>>> type SortedDict{K, D} <: Associative{K,D}
>>>>>>>>     bt::Dict{K,D}
>>>>>>>> end
>>>>>>>>
>>>>>>>> typealias SDToken Token{SortedDict, IntSemiToken}
>>>>>>>>
>>>>>>>> sdtoken_construct(m::SortedDict,int1::Int) = 
>>>>>>>>     SDToken(m, IntSemiToken(int1))
>>>>>>>>
>>>>>>>> test0(i::SDToken) = nothing
>>>>>>>>
>>>>>>>> function test1()
>>>>>>>>     s = SortedDict([1=>"a",2=>"b"])
>>>>>>>>     t = sdtoken_construct(s, 0)
>>>>>>>>     t2 = assemble(t.container, t.semitoken)
>>>>>>>>     println("typeof(t) = ", typeof(t))
>>>>>>>>     println("typeof(t2) = ", typeof(t2))
>>>>>>>>     println("methods(test0) = ", methods(test0))
>>>>>>>>     test0(t)
>>>>>>>>     test0(t2) #Line 38
>>>>>>>> end
>>>>>>>>
>>>>>>>> end
>>>>>>>>
>>>>>>>>
>>>

Reply via email to