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.
Posted at: 18:41 | Category: CodeHacking/Ocaml | Permalink