Hi,
I have an implementation of the Y which crashes Poly/ML. Take the program below and evaluate "fact n" with n>3.
I've tried it on both x86 and SPARC Solaris systems with Poly/ML 5.3, as well as on a (x86) MacOSX system with Poly/ML 5.4.1.
The program works in both Moscow ML and SMLNJ, so I'm pretty sure it is correct SML.
Best regards,
Lars-Henrik Eriksson, PhD, Senior Lecturer Computing Science, Dept. of Information Technology, Uppsala University, Sweden E-mail: lhe@it.uu.se, Web: http://www.it.uu.se/katalog/lhe?lang=en Phone: +46 18 471 10 57, Mobile: +46 705-36 39 16, Fax: +46 18 51 19 25
--------
(* The Y combinator in ML *)
abstype 'a ft = FT of 'a ft -> 'a with val Y = fn f => (fn (FT x) => (f (fn a => x (FT x) a))) (FT (fn (FT x) => (f (fn a => x (FT x) a)))) end
(* Y is the fixed point operator, i.e. fix F = Y(F) *) (* Y has type (('a -> 'b) -> ('a -> 'b)) -> ('a -> 'b) *)
(* Recursive definitions such as val rec f = ... can be written val f = Y (fn f => ...) *)
fun Fact f n = if n = 0 then 1 else n * f(n-1)
val fact = Y Fact