#load "camlp4o.cma";; let rec take n s = if n = 0 then [] else match s with parser [< 'x; s >] -> x :: take (n - 1) s;; (* 2(a) *) let rec map f = parser | [< 'x; s >] -> [< 'f x; map f s >];; let rec from n = [< 'n; from (n + 1) >];; let rec pi_stream_aux x = [< '(1.0 /. x); map (fun x -> -. x) (pi_stream_aux (x +. 2.)) >];; let rec partial_sum x = parser | [< 'n; s >] -> [< 'x; partial_sum (x +. n) s >];; let pi_stream = map (fun x -> x *. 4.) (partial_sum 0. (pi_stream_aux 1.));; take 10 pi_stream;; (* 2(b) *) let square x = x *. x;; let euler_f x y z = z -. (square (z -. y) /. (x -. 2. *. y +. z));; let rec euler_transform = parser | [< 'x; 'y; 'z; s >] -> [< 'euler_f x y z; euler_transform [< 'y; 'z; s >] >];; take 10 (euler_transform pi_stream);; (* 2(c) *) let rec tableau f s = [< 's; tableau f (f s) >];; let hd = parser [< 'x; s >] -> x let accelerate f s = map hd (tableau f s);; take 10 (accelerate euler_transform pi_stream);;