Welcome to this week's edition of "Confusing myself with Typed Racket".*

I want to import `response/xexpr-wrap` -- a version of `response/xexpr` 
that does some additional styling -- in a typed/racket file. So thanks to 
Ben and Jon in another thread, I now do

```
(require/typed xml [#:opaque Xexpr xexpr?])
(require/typed "tools.rkt" [#:opaque Response response?] 
[response/xexpr-wrap (-> Xexpr Response)])

(define x '(body (h1 "Not so Hello world")))
(response/xexpr-wrap x)
```

And this does not work. I get the error

```
expected: Xexpr
given: (List 'body (List 'h1 String))
```

even though it passes the `(xexpr? x)` passes, returning #t. I was somewhat 
surprised by this, but I guess the issue is that opaque types can only work 
at runtime on code from non-typed modules. However, since I pass `x` as an 
argument in my file, the type checker wants to type check it now, rather 
than putting contracts around the arguments passed into 
`response/xexpr-wrap`. 

If this is the case, is it possible to use opaque types to type check 
arguments into functions required from non-typed modules? Well, I can 
probably hack my way around this: I write a non-typed function in 
`tools.rkt` called `this-is-an-xexpr` which I require/typed with `(-> Any 
Xexpr)`, which if I understand things correctly should put run-time 
contracts around that function, but type check. (See below, I went and 
checked whether this worked, and it does.) A less hacky way would be to be 
less lazy and define an Xexpr type via `define-type Xexpr (U String Symbol 
(Listof ...)...)` and so on. This is probably what I'll do, but I wanted to 
know what is going on anyway.

If it is not the case, what is going on that makes this not work?

Despite having found a way to make this work, I'd like to know if there is 
a non-hacky way, whether I understand correctly why my naive approach 
failed, and what the (or a) recommended way of doing this is. 

Cheers - until next time.

Marc

EDIT LATER: Hah, my hack works! 

```{tools.rkt}
#lang racket

(provide make-xexpr ...)
(define (make-xexpr xexpr)
  xexpr)
```

and then in my typed file:

```
#lang typed/racket

(require/typed "tools.rkt" 
              [#:opaque Response response?]
              [#:opaque Xexpr xexpr?]
              [make-xexpr (-> Any Xexpr)]
              [response/wrap-xexpr (-> Xexpr Response)])

(define x '(body (h1 "Not so Hello world")))
(response/wrap-xexpr (make-xexpr x))
```

and this works. Nice, in an ugly kind of way.

*: Despite said confusion, ever since I got past the initial hump of using 
Typed Racket, it's been really useful though as it catches a substantial 
fraction of my bugs that would require sprinkling lots of printfairy dust 
to find and fix.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/0e428a87-095a-48fc-a31a-b393f4672642%40googlegroups.com.

Reply via email to