[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: in defense of types




To beat a dead horse completely into the ground, here is a summary of all
the ways seen so far to write the Y combinator in ocaml.  This proves
definitively that I was wrong ;-)

Mike


(* ocaml versions of the applicative-order Y combinator. *)

open Printf

(* Test function: *)
let mk_fact fact n = 
  if n = 0 then 1 else n * fact (n - 1)

(* 
 * This is the key trick.  Note that you're using a recursive _type_
 * to make Y work, instead of a recursive _function_.  This seems like
 * cheating to me.
 *)

type 'a t = I of ('a t -> 'a)

(*** Jaeyoun Chung ***)

let y1 f = 
  (function I x -> f (fun y' -> x (I x) y'))
    (I (function I x -> f (fun y' -> x (I x) y')))
;;

printf "y1: %d\n" ((y1 mk_fact) 10);;


(*** Pixel ***)

(* Using 'let rec' (cheating): *)
let rec y2 f e = f (y2 f) e;;

printf "y2: %d\n" ((y2 mk_fact) 10);;

(* Without 'let rec': *)
let y3 f = 
  let g = function (I x) -> f (fun y3 -> x (I x) y3) in
  g (I g)
;;

printf "y3: %d\n" ((y3 mk_fact) 10);;

(*** Felleisen; The Little MLer ***)

let g (I a) x = (a (I a)) x;;
let h f a = f (g a);;
let y4 f = (h f) (I (h f));;

printf "y4: %d\n" ((y4 mk_fact) 10);;


(* End of file. *)