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 >>>>>>>> >>>>>>>> >>>
