[racket-dev] match for polymorphic types in typed racket
I'm trying to use polymorphic types in a match pattern and cannot get certain type constructions to work. Here are examples.
match will work for the polymorphic type (Some a) (from the typed racket guide):
(struct: None ())
(struct: (a) Some ([v : a]))
(define-type (Opt a) (U None (Some a)))
(: f (All (a) ((Opt a) -> String)))
(define (f x)
(match x
[(None) "nothing here"]
[(Some s) (format "found ~a" s)]))
but it seems match is not able to work on a polymorphic type that has been specified:
(struct: (a) Record ([values : (HashTable String a)]))
(define-type ValueFlat (U Number (Record Number)))
(: format-value-flat (ValueFlat -> String))
(define (format-value-flat value)
(match value
; [(? number? n) "number"] ;; commented out to show this is not part of the problem
[(Record vs) "record"]))
> Type Checker: Cannot apply expression of type Procedure, since it is not a function type in: (match value ((Record vs) "record"))
Is this a bug in the way match interacts with the type checker, or is there a more preferred way to use match that I am missing?
Thanks,
David Darais