RosettaCodeData/Task/Y-combinator/F-Sharp/y-combinator-2.fs

8 lines
475 B
Forth

// Y combinator with injected laziness. GordonBGood : April 18, 2025
type 'T Mu = { eval: 'T Mu -> 'T }
let Y f = let g = fun x -> f <| fun() -> (x.eval x) in g { eval = g }
let fibonacci n = Y (fun fn f s i -> if i >= n then f else fn () s (f + s) (i + 1)) 1I 1I 1
let factorial n = Y (fun f p x -> if x > n then p else f () (x * p) (x + 1I)) 1I 1I
printfn "fibonacci 10 = %A\r\nfactorial 5 = %A" (fibonacci 10) (factorial 5I)
printfn "fibonacci 1000 = %A" (fibonacci 1000)