On 02/23/2012 03:16 PM, Sam Tobin-Hochstadt wrote:
On Thu, Feb 23, 2012 at 1:30 PM, Neil Toronto<neil.toro...@gmail.com>  wrote:
(: set-id (All (a) ((Set a) ->  (Set a))))
(define (set-id A) A)

(: set-id* (All (a) ((Set* a) ->  (Set* a))))
(define (set-id* A)
  ((inst set-id (U a (Set* a))) A))


Using `inst' makes the argument type pass, but I get an error on the return
type:

Expected  (Rec T (U Empty-Set
                    (Opaque-Set (U a T))))

but got          (U Empty-Set
                    (Opaque-Set (U a (Rec T (U Empty-Set
                                               (Opaque-Set (U a T)))))))

I've formatted it so that it's easy to see that the body type is just an
unfold of the expected type. Is there a way to make TR realize that they're
isomorphic?

That really should work, I'm not sure why it doesn't.

I sent a bug report with a more concrete example:

Would it be useful for TR to expose some of its recursive types machinery; i.e. provide `Fold' and `Unfold' as type constructors, for the cases where inference needs that kind of help? For example, I think this would be cleaner than wrapping `set-id' with `inst':

(define (set-id* A)
  (set-id (ann A (Unfold (Set* a)))))

But I don't know whether it would work. :)

Neil ⊥
____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to