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