variantでtree

なんとなく、実験。

using System;

variant Tree ['t] where 't : IComparable {
    | Node {
        left : Tree ['t];
        elem : 't;
        right : Tree ['t];
      }
    | Null
}

class Program {
    static  Insert ['t] (tree : Tree ['t], e : 't) : Tree ['t] where 't : IComparable {
        match (tree) {
            | Tree.Node (left, elem, right) =>
                if (elem.CompareTo (e) > 0) 
                    Tree.Node (Insert (left, e), elem, right)
                else if (elem.CompareTo (e) < 0)
                    Tree.Node (left, elem, Insert (right, e))
                else
                    tree
            | Tree.Null =>
                Tree.Node (Tree.Null (), e, Tree.Null ())
        }
    }

    static Travers ['t] (tree : Tree ['t]) : void where 't : IComparable {
        match (tree) {
            | Tree.Node (left, elem, right) =>
                Travers (left);
                Console.WriteLine (elem);
                Travers (right);
            | Tree.Null => ();
        }
    }

    static Main () : void {
        mutable r = Tree.Null ();
        Travers (Insert(Insert(Insert(Insert (r, 30), 10), 20),5));
    }
}

/*
5
10
20
30
 */