(* various recursive and tail recursive factorial functions *) (* define an exception *) exception negative of int; (* simple recursive version *) fun fact1 n = if (n = 0) then 1 else n * fact1(n-1); (* recursive value definition using a 'fn' lambda expression *) val rec fact5 = fn n => if (n=0) then 1 else n * fact5(n-1); (* recursive version using argument pattern matching *) fun fact2 0 = 1 | fact2 n = n * fact2(n-1); (* recursive version with check for negative value of n *) fun fact3 n = case (n < 0) of true => raise negative n | false => if (n=0) then 1 else n * fact3(n-1); (* tail recursive version using a let *) fun fact4 n = let fun fact (0,m) = m | fact (n,m) = fact (n-1, m*n) in if (n >= 0) then fact(n,1) else raise negative(n) end;