In what situations should one prefer the `listof` combinator over an equivalent 
predicate contract?

For instance, it seems to me that:

(λ(x) (and (list? x) (andmap pred? x)))

is a more-or-less equivalent way of saying this:

(listof pred?)

But in my experience the predicate version is always significantly faster. 
Thus, is it generally better to rewrite contracts to avoid `listof`? And if so, 
when is `listof` still preferred?



;;;;;;;;;;;;;;;;;;;;;;
;; For instance.
;;;;;;;;;;;;;;;;;;;;;;

#lang racket

(define/contract (f1 xs)
  ((listof integer?) . -> . any/c)
  xs)

(define (integers? x) (and (list? x) (andmap integer? x)))
(define/contract (f2 xs)
  (integers? . -> . any/c)
  xs)

(define (trial proc) (for ([i (in-range 1000)]) (proc (range 10000))))

(time (trial f1))
(time (trial f2))


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

Reply via email to