39 lines
841 B
Racket
39 lines
841 B
Racket
#lang typed/racket
|
|
|
|
;; Test subtyping and variance for recursive type aliases
|
|
|
|
(define-type (B X)
|
|
(U (Listof X) (Setof (B X))))
|
|
|
|
(: b1 (B String))
|
|
(define b1 (list "foo"))
|
|
|
|
(: b2 (B (U String Symbol)))
|
|
(define b2 b1)
|
|
|
|
(: f (All (Y) (Y -> (B Y))))
|
|
(define (f x) (list x))
|
|
|
|
(: g (All (X) (X -> (B X))))
|
|
(define g f)
|
|
|
|
;; Adapted from struct variance test
|
|
(define-type (Boxer D) (List (Boxer2 D)))
|
|
(define-type (Boxer2 D) (List (D -> Void) (Boxer D)))
|
|
|
|
(: f-Boxer (All (D) ((Boxer D) D -> Void)))
|
|
(define (f-Boxer boxer v)
|
|
((car (car boxer)) v))
|
|
|
|
;; The last line in this example would error without
|
|
;; registering the variance
|
|
(define-type (Even A) (U Null (Pairof A (Odd A))))
|
|
(define-type (Odd A) (Pairof A (Even A)))
|
|
|
|
(: even->odd (All (A) (A (Even A) -> (Odd A))))
|
|
(define (even->odd elem lst)
|
|
(cons elem lst))
|
|
|
|
(even->odd 3 '(1 2))
|
|
|