[racket] typed racket: equivalent to Any for function types?

From: Sam Tobin-Hochstadt (samth at ccs.neu.edu)
Date: Mon Nov 28 10:54:27 EST 2011

On Mon, Nov 28, 2011 at 10:35 AM, Ismael Figueroa Palet
<ifigueroap at gmail.com> wrote:
> As Any is supertype of all values, what is the equivalent type for function
> types?
>
> (Any -> Any) does not work because of the contra-variant requirement of the
> argument.
>
> (: f ((Any -> Any) -> True))
> (define (f g) #t)
>
> (f (lambda (x) x) #t) ;; works
> (f (lambda: ([x : Integer]) #f)) ;; does not work
>
> The error is:
>
> Type Checker: Expected (Any -> Any), but got (Integer -> Any) in: (lambda:
> ((x : Integer)) #f)
>
> If I understand it correctly, the type I'm looking for is (Bottom -> Any),
> which satisfies the contra-variant and variant requirements for function
> subtyping. However, the Bottom type doesn't seem to exist (at least at the
> user-level, because I remember seeing some error messages that mentioned Top
> and Bottom).

You're probably looking for the type `Nothing'.  Note that functions
of type `(Nothing -> T)' are very hard to apply, though.

-- 
sam th
samth at ccs.neu.edu


Posted on the users mailing list.