(* Carsten Schuermann *) (* The visitor pattern in ML *) let datatype Exp = Int of int | Add of Exp * Exp fun visitorExp (Int e) f g = f (Int e) | visitorExp (Add (e1, e2)) f g = g (visitorExp e1 f g, visitorExp e2 f g) val E = Add (Int 5, Add (Add (Int 7, Int 9), Int 16)) val N = visitorExp E (fn Int x => x) (fn (x, y) => x + y) val S = visitorExp E (fn Int x => Int.toString x) (fn (x, y) => x ^ "+" ^ y) in (N, S) end