#lang typed-scheme
(define-type-alias number Number)
(define-type-alias boolean Boolean)
(define-type-alias top Any)

(define: a : (number -> number) (lambda: ([x : number]) x))
(define: f : (case-lambda (number -> number)
			  (boolean boolean -> boolean))
  (case-lambda
   [(#{x : number}) (add1 x)]
   [(#{a : boolean} #{b : boolean}) (and a b)]))

(define: f* : (case-lambda (number -> number)
			   (boolean boolean -> boolean))
  (case-lambda:
   [([x : number]) (add1 x)]
   [([a : boolean] [b : boolean]) (and a b)]))

(f 5)

(f #t #f)

#;(f #t)

(define-type-alias (idfunty a) (a -> a))
(define-type-alias (idfunty2 a) (a -> a))

(define: g : (idfunty number) (lambda: ([x : number]) x))

(define: (h [f : (idfunty number)]) : number (f 5))
(define: (h* [f : (idfunty2 number)]) : number (f 5))

(h f*)
(h* f*)

(f #t)
#lang typed-scheme
(define-type-alias number Number)
(define-type-alias boolean Boolean)
(define-type-alias top Any)

(define: a : (number -> number) (lambda: ([x : number]) x))
(define: f : (case-lambda (number -> number)
			  (boolean boolean -> boolean))
  (case-lambda
   [(#{x : number}) (add1 x)]
   [(#{a : boolean} #{b : boolean}) (and a b)]))

(define: f* : (case-lambda (number -> number)
			   (boolean boolean -> boolean))
  (case-lambda:
   [([x : number]) (add1 x)]
   [([a : boolean] [b : boolean]) (and a b)]))

(f 5)

(f #t #f)


(define-type-alias (idfunty a) (a -> a))
(define-type-alias (idfunty2 a) (a -> a))

(define: g : (idfunty number) (lambda: ([x : number]) x))

(define: (h [f : (idfunty number)]) : number (f 5))
(define: (h* [f : (idfunty2 number)]) : number (f 5))

(h f*)
(h* f*)
