We define the type of boolean expressions whose atoms are identified by strings as
type expr = | Atom of string | Not of expr | And of expr * expr | Or of expr * expr
and can evaluate these expressions using an
oracle : string -> bool giving the values of the atoms we find as follows:
let rec eval oracle = function | Atom(name) -> oracle name | Not(expr) -> not(eval oracle expr) | And(expr1, expr2) -> (eval oracle expr1) && (eval oracle expr2) | Or(expr1, expr2) -> (eval oracle expr1) || (eval oracle expr2)
See how the function is clear and easy to read. Thanks to correct use of pattern matching, a programmer reading this function needs little time to ensure it is correctly implemented.