16 lines
548 B
Racket
16 lines
548 B
Racket
#lang typed-scheme
|
|
|
|
(: make-recursive : (All (S T) (((S -> T) -> (S -> T)) -> (S -> T))))
|
|
(define (make-recursive f)
|
|
(define-type-alias Tau (Rec Tau (Tau -> (S -> T))))
|
|
((lambda: ([x : Tau]) (f (lambda: ([z : S]) ((x x) z))))
|
|
(lambda: ([x : Tau]) (f (lambda: ([z : S]) ((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))))))))
|