(* A simple arithmetic evaluator. *) open System type Expr = | Number of int | Plus of Expr * Expr | Minus of Expr * Expr | Mult of Expr * Expr let rec eval(e: Expr) : int = match e with | Number n -> n | Plus(e1, e2) -> (eval e1) + (eval e2) | Minus(e1, e2) -> (eval e1) - (eval e2) | Mult(e1, e2) -> (eval e1) * (eval e2) let rec prettyprint(e: Expr) : string = match e with | Number n -> n.ToString() | Plus(e1, e2) -> (prettyprint e1) + " + " + (prettyprint e2) | Minus(e1, e2) -> (prettyprint e1) + " - " + (prettyprint e2) | Mult(e1, e2) -> (prettyprint e1) + " * " + (prettyprint e2) [] let main argv = let e = Minus(Plus(Number 1, Mult(Number 2, Number 3)), Number 1) printfn "You typed: %A" (prettyprint e) let result = eval e printfn "Result is: %d" result 0