Is there any way for a predicate-ish thing to do something like this:
#lang typed/racket
(: vectorof-real? : [(U Number (Vectorof Real))
                     -> Boolean :
                     #:+ (Vectorof Real)
                     #:- Number])
(define (vectorof-real? x)
  (vector? x))

Because this works:
(let ([x : (U Number (Vectorof Real)) #(1 2 3)])
  (if (vector? x)
      (ann x (Vectorof Real))
      (ann x Number)))

And also I noticed the types for the functions filter and partition are:
 > filter
 - : (All (a b)
        (case->
        (-> (-> a Any : #:+ b) (Listof a) (Listof b))
        (-> (-> a Any) (Listof a) (Listof a))))
 #<procedure:filter>
 > partition
 - : (All (a b)
       (case->
        (-> (-> a Any) (Listof a) (values (Listof a) (Listof a)))
        (-> (-> Any Boolean : a) (Listof b) (values (Listof a) (Listof b)))))
 #<procedure:partition>

For the filter function, the predicate only has to accept the type a for both 
cases and can return Any for both cases.  Is there any reason why the second 
case of partition doesn’t do that?  And is there a reason why it doesn’t use 
#:+ for the filter?  

The current type for partition wouldn’t allow me to use my vectorof-real? as 
the predicate even if it did work, right?  But filter would?  



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

Reply via email to