31 lines
846 B
Racket
31 lines
846 B
Racket
#lang typed-scheme
|
|
(define-type-alias top Any)
|
|
(define-type-alias set (top -> top))
|
|
|
|
(define: (autos [elt : top]) : top (memq elt '(vw saab bmw audi)))
|
|
|
|
(define: (element-of? [elt : top] [s : set]) : top (s elt))
|
|
|
|
;; CHANGE - use exact-integer?
|
|
(define: (evens [elt : top]) : top (and (exact-integer? elt) (even? elt)))
|
|
|
|
(define-typed-struct pr ([fst : top] [snd : top]))
|
|
|
|
#;(define: (length=2? [any : top]) : boolean
|
|
(and (pair? any)
|
|
(pair? (cdr any))
|
|
(empty? (cdr (cdr any)))))
|
|
|
|
(define: (cartesian-product [A : set] [B : set]) : set
|
|
(lambda: ([elt : top])
|
|
(and (pr? elt)
|
|
(element-of? (pr-fst elt) A)
|
|
(element-of? (pr-snd elt) B))))
|
|
|
|
|
|
|
|
(define: evenEuroCars : set (cartesian-product evens autos))
|
|
#;(display (element-of? (make-pr 4 'bmw) evenEuroCars)) ; = #t
|
|
#;(display (element-of? (make-pr 'bmw 4) evenEuroCars)) ; = #f
|
|
|