(* Carsten Schuermann *) (* The visitor pattern in ML *) let datatype 'a List = Nil | Cons of 'a * 'a List fun visitorList (Nil) c g = c | visitorList (Cons (H, T)) f g = g (H, visitorList T f g) val E = Cons (5, Cons (2, Nil)) val N = visitorList E Nil (fn (x, y) => Cons (x*x, y)) val S = String.implode (visitorList E [#"[", #"]"] (fn (x, [c1, c2]) => c1 :: String.explode (Int.toString x) @ [c2] | (x, c :: s) => c :: String.explode (Int.toString x) @ #"," :: #" " :: s)) in (N, S) end