RosettaCodeData/Task/Y-combinator/Racket/y-combinator-3.rkt
Ingy döt Net 776bba907c Sync
2013-10-27 22:24:23 +00:00

17 lines
554 B
Racket

#lang typed/racket
(: make-recursive : (All (S T) ((S -> T) -> (S -> T)) -> (S -> T)))
(define-type Tau (All (S T) (Rec this (this -> (S -> T)))))
(define (make-recursive f)
((lambda: ([x : (Tau S T)]) (f (lambda (z) ((x x) z))))
(lambda: ([x : (Tau S T)]) (f (lambda (z) ((x x) z))))))
(: fact : Number -> Number)
(define fact (make-recursive
(lambda: ([fact : (Number -> Number)])
(lambda: ([n : Number])
(if (zero? n)
1
(* n (fact (- n 1))))))))
(fact 5)