I want to write this piece of code:

(: only-non-false (All (T) ((Listof (U T False)) -> (Listof T))))
(define (only-non-false l)
  (filter (ann (lambda (x) x)
               ((U T False) -> Any : T))
          l))

... but Typed Racket says:

Type Checker: Expected result with filter ((T @ x) | (! T @ x)), got filter ((! 
False @ x) | (False @ x)) in: x

I'm guessing that Typed Racket isn't clever enough to figure out that when the 
input is (U T False), that a filter on not-false is the same as a filter on T.

I gave up on the general case and focused in on the specific one I want, and 
ran into another problem where I want subtyping.

Specifically, consider this code:

#lang typed/racket

(: a (Listof (U False (Listof Number))))
(define a '((34) #f (9 22) #f))

(ann (filter pair? a)
     (Listof (Listof Number)))

I know that the result is a list of numbers, but that information gets lost... 
I suppose the abstraction that I need here would be something like a case on 
the right-hand-side of a filter type... oog, no, I think that still wouldn't 
help. 

I can solve this by refining the predicate so that it matches the (Listof 
Number) type exactly, but that seems a bit cumbersome.  

Am I missing something obvious in either of these?

Alas, things like this are why TR is *still* in the bin of 
"things-I-tackle-when-I'm-not-pressured-for-time".

Thanks!

John

Attachment: smime.p7s
Description: S/MIME cryptographic signature

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to