(* Sample ML program - Abstract Syntax Trees *) (* Declare the ast datatype *) datatype ast = empty | leaf of int | node of string*ast*ast; fun traverse(empty) = print("empty tree") | traverse(leaf(n)) = let val nstr = Int.toString(n)^" " in print(nstr) end | traverse(node(operator, left, right)) = let val dummy = let val oper = operator^" " in print(oper) end val l = traverse(left) val r = traverse(right) in print("") end fun prefix(tree:ast) = let val dummy = traverse(tree) in print("\n") end; prefix(leaf(4)); prefix(node("*",node("+",leaf(5),leaf(3)),node("-",leaf(10),leaf(4)))); The output from SML is as follows: - use "pre.sml"; [opening pre.sml] datatype ast = empty | leaf of int | node of string * ast * ast val traverse = fn : ast -> unit val prefix = fn : ast -> unit 4 val it = () : unit * + 5 3 - 10 4 val it = () : unit val it = () : unit -