<div dir="ltr">I've got three modules:<div>- One untyped module defines some structs</div><div>- One typed module defines some helper functions</div><div>- One typed module does some interesting things</div><div><br></div><div>I've also got a problem: I cannot share imported untyped structs between the typed modules.</div><div><br></div><div>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).</div><div><br></div><div>Here's the minimal example. Can we at least make the error message more helpful?</div><div><br></div><div><div><font face="monospace, monospace">#lang racket/base</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(module data-defn racket/base</font></div><div><font face="monospace, monospace">  (provide (struct-out foo))</font></div><div><font face="monospace, monospace">  (struct foo ()))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(module utils typed/racket/base</font></div><div><font face="monospace, monospace">  (provide foo->string)</font></div><div><font face="monospace, monospace">  (require/typed (submod ".." data-defn) [#:struct foo ()])</font></div><div><font face="monospace, monospace">  (: foo->string (-> foo String))</font></div><div><font face="monospace, monospace">  (define (foo->string f) "foo"))</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(module main typed/racket/base</font></div><div><font face="monospace, monospace">  (require/typed (submod ".." data-defn) [#:struct foo ()])</font></div><div><font face="monospace, monospace">  (require (submod ".." utils))</font></div><div><font face="monospace, monospace">  (: main (-> Void))</font></div><div><font face="monospace, monospace">  (define (main)</font></div><div><font face="monospace, monospace">    (displayln (foo->string (foo)))))</font></div><div><br></div><div><div><font face="monospace, monospace">;; Type Checker: type mismatch</font></div><div><font face="monospace, monospace">;;  expected: foo</font></div><div><font face="monospace, monospace">;;  given: foo</font></div><div><font face="monospace, monospace">;;  in: (foo)</font></div></div><div><br></div><div><br></div></div></div>