Allow recursive types in type annotations for `list'.

Closes PR 10562.
 Tests for fixed bugs.

original commit: 7e9313bad3c8f8b7d6e0241f6904dce45ac77786
This commit is contained in:
Sam Tobin-Hochstadt 2010-05-19 11:38:01 -05:00
parent d27153b74c
commit 1e25674287
5 changed files with 37 additions and 2 deletions

View File

@ -0,0 +1,12 @@
#lang typed-scheme
(require/typed
scheme/base
[values (All (T) ((Any -> Boolean) -> (Any -> Boolean : T)))])
(: number->string? (Any -> Boolean : (Number -> String)))
(define (number->string? x)
(((inst values (Number -> String)) procedure?) x))
(: f (Number -> String))
(define f
(if (number->string? +) + number->string))

View File

@ -0,0 +1,14 @@
#lang typed-scheme
(define-type-alias LSN (Rec LSN (U '() (cons Number LSN) (cons Symbol LSN))))
(: sum (LSN -> Number))
;; add all numbers in this lsn
(define (sum lsn)
(cond
[(null? lsn) 0]
[(number? (car lsn)) (+ (car lsn) (sum (cdr lsn)))]
[else (sum (cdr lsn))]))
(sum '(a b 2 3))

View File

@ -0,0 +1,5 @@
#lang typed-scheme
(require/typed
scheme/base
[opaque WeakBox weak-box?]
[make-weak-box (Any -> WeakBox)])

View File

@ -0,0 +1,4 @@
#lang typed/racket
(: foo : (Rec this (List Number (Boxof (U #f this)))))
(define foo (list 1 (box #f)))
(set-box! (second foo) foo)

View File

@ -3,7 +3,7 @@
(require "../utils/utils.rkt")
(require (rep type-rep object-rep filter-rep rep-utils)
"printer.rkt" "utils.rkt"
"printer.rkt" "utils.rkt" "resolve.rkt"
(utils tc-utils)
scheme/list
scheme/match
@ -42,7 +42,7 @@
(foldr -pair (-val '()) l))
(define (untuple t)
(match t
(match (resolve t)
[(Value: '()) null]
[(Pair: a b) (cond [(untuple b) => (lambda (l) (cons a l))]
[else #f])]