Why not create an intermediary module? Create a typed module, call it 
typed/data-defn, and use require/typed/provide to import the struct and provide 
it. Then just require that module for all other modules that need to use that 
struct in a typed context.

> On Feb 5, 2015, at 21:10, Benjamin Greenman <bl...@cornell.edu> wrote:
> 
> I've got three modules:
> - One untyped module defines some structs
> - One typed module defines some helper functions
> - One typed module does some interesting things
> 
> I've also got a problem: I cannot share imported untyped structs between the 
> typed modules.
> 
> The problem goes away if I linearize the module dependencies, but I'd prefer 
> not to do that -- the situation I have in real life uses two orthogonal 
> modules of helper functions (so the overall inheritance graph is a diamond).
> 
> Here's the minimal example. Can we at least make the error message more 
> helpful?
> 
> #lang racket/base
> 
> (module data-defn racket/base
>   (provide (struct-out foo))
>   (struct foo ()))
> 
> (module utils typed/racket/base
>   (provide foo->string)
>   (require/typed (submod ".." data-defn) [#:struct foo ()])
>   (: foo->string (-> foo String))
>   (define (foo->string f) "foo"))
> 
> (module main typed/racket/base
>   (require/typed (submod ".." data-defn) [#:struct foo ()])
>   (require (submod ".." utils))
>   (: main (-> Void))
>   (define (main)
>     (displayln (foo->string (foo)))))
> 
> ;; Type Checker: type mismatch
> ;;  expected: foo
> ;;  given: foo
> ;;  in: (foo)
> 
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

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

Reply via email to