Could Typed Racket generate more fine grained predicates in a type-directed fashion to allow this sort of thing?
Jay On Fri, Aug 13, 2010 at 8:32 AM, Sam Tobin-Hochstadt <[email protected]> wrote: > On Thu, Aug 12, 2010 at 4:11 PM, Neil Toronto <[email protected]> wrote: >> 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. > > Unfortunately, that isn't the semantics of the underlying struct > predicate - there's no way to ask Racket to "specialize" struct > predicates to a particular type. The Typed Racket type corresponds to > what the `data?' predicate that the `struct' form defines. > -- > sam th > [email protected] > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/users > -- Jay McCarthy <[email protected]> Assistant Professor / Brigham Young University http://teammccarthy.org/jay "The glory of God is Intelligence" - D&C 93 _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

