Mon, 11 Sep 2006
Ocaml : Code for Variant Types and Pattern Matching.
Since my blog post on Ocaml's Variant Types and Pattern Matching I've had two requests for the code, so here it is:
type expr_t = | Var of string | Plus of expr_t * expr_t | Times of expr_t * expr_t | Divide of expr_t * expr_t let rec simplify expr = match expr with | Times (a, Plus (b, c)) -> Plus (simplify (Times (a, b)), simplify (Times (a, c))) | Divide (Divide (a, b), Divide (c, d)) -> Divide (simplify (Times (a, d)), simplify (Times (b, c))) | anything -> anything (* Comment : default case *) let rec str_of_expr expr = match expr with | Var v -> v | Plus (a, b) -> "(" ^ (str_of_expr a) ^ "+" ^ (str_of_expr b) ^ ")" | Times (a, b) -> (str_of_expr a) ^ "*" ^ (str_of_expr b) | Divide (a, b) -> (str_of_expr a) ^ " / " ^ (str_of_expr b) let _ = let expr = Times (Var "x", Plus (Var "y", Var "z")) in Printf.printf " orig : %s\n" (str_of_expr expr) ; let expr = simplify expr in Printf.printf " new : %s\n" (str_of_expr expr)
The above code is a single self contained program; to run that program, save it to to a file named say "cas.ml" then run it (assuming you have ocaml installed) using the command "ocaml cas.ml" which should result in the following output:
orig : x*(y+z) new : (x*y+x*z)
Obviously, this is just just a demo, but it should be pretty clear that this code could easily be extended to something more useful.