Are there any plans for it? Would it be difficult to do? I ask because it seems it would make using polymorphic struct subtypes easier. Here's an example of the problem:

#lang typed/racket

(struct: (T) datum ([val : T]))
(struct: (T) data datum ([vals : (Listof T)]))

(: get-vals (All (T) ((datum T) -> (Listof T))))
;; Returns the values in the struct as a list
(define (get-vals d)
                     ; type error here:
  (cond [(data? d)   (cons (datum-val d) (data-vals d))]
        [(datum? d)  (list (datum-val d))]))

(get-vals (data 1 '(2 3 4)))

#|
Type Checker: Polymorphic function cons could not be applied to arguments:
Types: a (Listof a) -> (Listof a)
       a b -> (Pairof a b)
Arguments: Nothing (Listof Any)
Expected result: (Listof T)
 in: (cons (datum-val d) (data-vals d))
|#


The problem is the type of data?, which is (Any -> Boolean : (data Any)), so in the first branch above, d has type (data Any) instead of (data T). But if data? : (All (S) (Any -> Boolean : (data S))), it seems I could make this function work, even if I had to annotate data? with (Any -> Boolean : (data T)) to use it.

BTW, shouldn't the first argument type to cons be Any instead of Nothing?

Neil T
_________________________________________________
 For list-related administrative tasks:
 http://lists.racket-lang.org/listinfo/users

Reply via email to