On 02/22/2012 03:34 PM, Sam Tobin-Hochstadt wrote:
On Wed, Feb 22, 2012 at 3:51 PM, Neil Toronto<neil.toro...@gmail.com>  wrote:
The following program types without trouble:


#lang typed/racket

(struct: (a) Foo ())

(: make-foo (All (a) (a ->  (Foo a))))
(define (make-foo x)
  (Foo))

(ann (make-foo 1) : (Foo String))

It doesn't seem like it should, though. If this is the right behavior, is
there a way to get a `Foo' parameterized on type `a' without actually
storing the value? I'm trying to use TR to check programs that can't
actually be run (i.e. written in a lambda calculus extended with uncountable
sets).

What you're seeing is that TR currently implements type instantiation
with substitution, and so encodings like 'phantom types' don't work.
This isn't a soundness hole, but it's something that I'm willing to
change if there are programs you'd like to write that you can't.  Can
you give a more complete example?

Oh, that's what they're called. I should have remembered them from crazy Haskell metaprogramming.

Would changing it speed up type-checking? :)

Anyway, I've worked around it. Here's how:


#lang typed/racket

(struct: (a) Foo ([rep : (-> a)]))

(: make-foo (All (a) (a ->  (Foo a))))
(define (make-foo x)
  (Foo (λ () (error 'make-foo "phantom (woo!)"))))

;; TR appropriately barfs on this:
(ann (make-foo 1) : (Foo String))


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

Reply via email to