(* val sum : int list -> int *) fun sum nil = 0 | sum (n::l) = n + sum l (* val sum : int list -> int *) fun sum l = let fun sum' nil k = k 0 | sum' (n::nl) k = sum' nl (fn x => n + k x ) in sum' l (fn x => x) end datatype 'a tree = Leaf of 'a | Node of 'a tree * 'a tree (* val sumLeaf : int tree -> int *) fun sumLeaf t = let fun sumLeaf' (Leaf n) acc = n + acc | sumLeaf' (Node(l, r)) acc = sumLeaf' l (sumLeaf' r acc) in sumLeaf' t 0 end (* val sumLeaf : int tree -> int *) local fun sumLeaf' (Leaf n) k : int = k n | sumLeaf' (Node(l, r)) k = sumLeaf' l (fn x => x + sumLeaf' r k) in fun sumLeaf t = sumLeaf' t (fn y => y) end datatype exp = Val of int | Sum of exp * exp | Div of exp * exp (* val eval : exp -> int option *) fun eval e = let fun eval' (Val(n)) k = k n | eval' (Sum(e1, e2)) k = eval' e1 (fn v1 => eval' e2 (fn v2 => k (v1 + v2))) | eval' (Div(e1, e2)) k = eval' e1 (fn v1 => eval' e2 (fn v2 => if v2 = 0 then NONE else k (v1 div v2))) in eval' e (fn x => SOME(x)) end