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