Sorry my first sentence should have read: > Julia will *not* be able to produce specialised code for any non-concrete type > in your PhyNode.
> It does not matter whether it's Any or some other > abstract/parameter-less type. At least that is how I read the docs: > http://docs.julialang.org/en/latest/manual/performance-tips/#type-declarations > > However, I think a method will only be slow if it actually uses the > PhyNode.extensions field, otherwise it should be fine. > > Anyway, can you not construct your type like so: > type PhyExtension{T} > value::T > end > > type PhyNode{T} > name::String > branchlength::Float64 > confidence::Float64 > extensions::Vector{PhyExtension{T}} > children::Vector{PhyNode{T}} > parent::PhyNode{T} > end > > If a user needs to have different types of things in PhyNode.extensions > she can choose PhyExtension{Any} and loose some performance, otherwise a > concrete type, like PhyExtension{Float64}, will be fast. > > On Tue, 2015-02-24 at 02:30, Ben Ward <axolotlfan9...@gmail.com> wrote: >> Hi, >> >> In Julia, if you are not sure of an arguments type beforehand, you can use >> 'Any', or if you know it comes under an abstract type, you can use that. >> >> I've been working on a type for BioJulia which allows for representation of >> a node of a phylogenetic tree that will allow annotation with biological >> data in the form of other types from the packages from BioJulia: >> >> @doc """ >> PhyExtension allows defining arbitrary metadata to annotate nodes. >> >> >> this allows the PhyNode type to support any phylogenetic tree format >> that includes annotations (e.g. PhyloXML, NeXML), and allows programmatic >> extension of nodes with annotations. >> """ -> >> type PhyExtension{T} >> value::T >> end >> >> >> @doc """ >> PhyNode represents a node in a phylogenetic tree. >> >> >> A node can have: >> >> >> - `name` >> - `branchlength` >> - one or more `extensions` >> - a reference to its `parent` PhyNode >> - reference to one or more `children` >> """ -> >> type PhyNode >> name::String >> branchlength::Float64 >> confidence::Float64 >> extensions::Vector{PhyExtension} >> children::Vector{PhyNode} >> parent::PhyNode >> # Inner constructor goes here. >> >> As you can see - PhyExtension is parametric so can be constructed to >> contain any type. >> >> I'm wondering, though is this the best that can be done, can I handle the >> potential to hold any number of types with unknown variables any better - >> if so, how? >> >> Is specifying a Vector of PhyExtension, where a PhyExtenision is a type >> that contains any other type really giving that much information to the >> Julia system to work on efficiently? >> >> My understanding is that PhyExtension is parametric so a version is >> effectively defined for every possible {T} (including user defined >> composite types they might come up with). But then I imagine that's not >> much information when creating the Vector{PhyExtension} as an element could >> be any of the many possible PhyExtensions - the compiler has to allow for >> an array that can store any PhyExtension? Or is it that the array contains >> references to PhyExtensions so actually the array is simple? >> >> Thanks, >> Ben.