Thanks, Tim.  Yes, of course the dispatch mechanism is a much better way to 
find out the type parameter.  

Cheers, 

---david

On Tuesday, October 28, 2014 11:10:57 AM UTC+1, Tim Holy wrote:
>
> 2nd is much better. But you can even write your `kind` function using 
> dispatch: 
>
>     kind{T}(g::GMM{T,Matrix{T}}) = :diag 
>     kind{T}(g::GMM{T,Vector{Matrix{T}}}) = :full 
>
> See the FAQ for more info about containers with abstract fields 
> (especially the 
> part about inner constructors). 
>
> --Tim 
>
> On Tuesday, October 28, 2014 02:03:57 AM David van Leeuwen wrote: 
> > Hello, 
> > 
> > For a long lime I've been having a bad feeling for having a Union in a 
> > composite type, as in 
> > 
> > type GMM{T:<FloatingPoint} 
> > ... 
> >  kind::Symbol 
> >  μ::Matrix{T} 
> >  Σ::Union(Matrix{T},Vector{Matrix{T}}) 
> > ... 
> > end 
> > 
> > where the choice in `Σ` depends on whether `kind==:diag` or 
> `kind==:full`. 
> >  I have the feeling it is better to have defined something along the 
> lines 
> > of 
> > 
> > typealias  DiagCov{T}  Matrix{T} 
> > typealias  FullCov{T}  Vector{Matrix{T}} 
> > 
> > type GMM{T:<FloatingPoint,CT} 
> > ... 
> >  μ::Matrix{T} 
> >  Σ::CT 
> > end 
> > 
> > function kind(g::GMM) 
> >     T = eltype(g.μ) 
> >     if isa(g.Σ, FullCov{T}) 
> >         return :full 
> >     else 
> >         return :diag 
> >     end 
> > end 
> > 
> > 
> > In the second case, the `kind` is inferred from the type instance, 
> rather 
> > than stored as a type variable. 
> > 
> > What is in your expert's opinion a better way of defining such a type? 
> > 
> > Thanks, 
> > 
> > ---david 
>
>

Reply via email to