That's a great solution, but if performance matters see
http://docs.julialang.org/en/release-0.3/manual/faq/#how-do-abstract-or-ambiguous-fields-in-types-interact-with-the-compiler
and the following section.

--Tim

On Thursday, January 15, 2015 08:12:09 PM Evan Pu wrote:
> very handy, just saw this reply now.
> thanks a ton
> 
> On Thursday, November 6, 2014 at 5:16:31 PM UTC-5, Valentin Churavy wrote:
> > You could using a abstract type instead of a Union
> > 
> > abstract Element
> > type Tree
> > 
> >   body :: Element
> > 
> > end
> > 
> > type Branch <: Element
> > 
> >   a :: Tree
> >   b :: Tree
> > 
> > end
> > 
> > type Leaf <: Element
> > 
> >   a
> > 
> > end
> > 
> > so  this would create a tree
> > julia> Tree(Branch(
> > 
> >                        Tree(Leaf(:a)),
> >                        Tree(Branch(
> >                        
> >                               Tree(Leaf(:b)),
> >                               Tree(Leaf(:c))
> >                            
> >                            ))
> >               
> >               ))
> > 
> > Tree(Branch(Tree(Leaf(:a)),Tree(Branch(Tree(Leaf(:b)),Tree(Leaf(:c))))))
> > 
> > adding the following methods makes it a bit more readable
> > 
> > Tree(a :: Any) = Tree(Leaf(a))
> > Tree(a :: Tree,b::Tree) = Tree(Branch(a, b))
> > 
> > julia> Tree(
> > 
> >             Tree(:a),
> >             Tree(
> >             
> >                  Tree(:b),
> >                  Tree(:c)
> >                  
> >                                   )
> >             
> >             )
> > 
> > Tree(Branch(Tree(Leaf(:a)),Tree(Branch(Tree(Leaf(:b)),Tree(Leaf(:c))))))
> > 
> > 
> > So this stills looks a bit clunky and you should also be aware that this
> > allows for Tree(Tree(:a), Tree(1.0)) so some type constraints would be in
> > order.
> > 
> > On Thursday, 6 November 2014 21:52:05 UTC+1, Evan Pu wrote:
> >> Quick question:
> >> 
> >> In haskell one can do something like the following to define a type:
> >>  data Tree a = Branch (Tree a) (Tree a) | Leaf a
> >> 
> >> Is there something analogous in the Julia world?
> >> I'm sure I'm doing something wrong here...
> >> 
> >> julia> type Tree
> >> 
> >>        body :: Union(Branch, Leaf)
> >>        end
> >> 
> >> ERROR: Branch not defined
> >> 
> >> julia> type Branch
> >> 
> >>        a :: Tree
> >>        b :: Tree
> >>        end
> >> 
> >> ERROR: Tree not defined
> >> 
> >> julia> type Leaf
> >> 
> >>        a
> >>        end
> >> 
> >> thanks!

Reply via email to