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