(* Part I *) type nat = int ;; let rec fact (n:nat) : nat = if n <= 0 then 1 else fact (n-1) * n ;; let rec fib (n:nat) : nat = match n with 0 -> 0 | 1 -> 1 | n -> fib (n-1) + fib (n-2) ;; (* Solution *) type cont = nat -> nat ;; let rec fact_cont (n:nat) (k:cont) : nat = if n <= 0 then k 1 else fact_cont (n-1) (fun m -> k (m*n)) ;; let rec fib_cont (n:nat) (k:cont) : nat = match n with 0 -> k 0 | 1 -> k 1 | n -> fib_cont (n-1) (fun m1 -> fib_cont (n-2) (fun m2 -> k (m1 + m2))) ;; fact 4;; fact_cont 4 (fun m -> m);; fib 4;; fib_cont 4 (fun m -> m);; (* Part II *) let c = 5;; let d = 6;; let apply (f : int -> int) : int = f (c*d) ;; let sum (y : int) : int = y + c + d;; let result = apply sum;; (* solution *) type env = {cx:int; dx:int};; type ('a,'b) closure = ('a * env -> 'b) * env;; let apply_code ((f_closure, env) : (int,int) closure * env) : int = let (f_code,f_env) = f_closure in f_code (env.cx*env.dx, f_env) ;; let sum_code ((y, env) : int * env) : int = y + env.cx + env.dx ;; let result_closure = apply_code ((sum_code, {cx=c; dx=d}), {cx=c; dx=d});;