While it does work, there is definitely a loss of informative intent in the sense of the &quot;documentation&quot; to the human reader provided by the type signatures.  If define-type is strictly an aliasing then the original construction should work and its failure a bug.  Do you agree?  If so I&#39;ll open a bug report.<div>
<br></div><div>Thanks again.</div><div><br></div><div>Ray<br><br><div class="gmail_quote">On Thu, Jul 19, 2012 at 6:51 PM, Ray Racine <span dir="ltr">&lt;<a href="mailto:ray.racine@gmail.com" target="_blank">ray.racine@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Nice.  Thank you.<div class="HOEnZb"><div class="h5"><br><br>On Thursday, July 19, 2012, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu" target="_blank">cce@ccs.neu.edu</a>&gt; wrote:<br>
&gt; This works if you expand the use of Iteratee within the definition of<br>&gt; Continuation.  Mutually-recursive polymorphic types are problematic,<br>
&gt; but Continuation is only actually singly-recursive.  You can still<br>&gt; have the definition Iteratee for outside use.<br>&gt;<br>&gt; Carl Eastlund<br>&gt;<br>&gt; #lang typed/racket/base<br>&gt;<br>&gt; ;; Inputs<br>

&gt; (define-type (Stream D) (U (Datum D) &#39;Nothing &#39;EOS))<br>&gt; (struct: (D) Datum ([iota : D]))<br>&gt;<br>&gt; ;; Iteratee<br>&gt; (define-type (Iteratee D A) (U (Done D A) (Continuation D A)))<br>&gt; (struct: (D A) Done ([accum : A] [stream : (Stream D)]))<br>

&gt; (struct: (D A) Continuation ([resume : ((Stream D) -&gt; (U (Done D A)<br>&gt; (Continuation D A)))]))<br>&gt;<br>&gt;<br>&gt; On Thu, Jul 19, 2012 at 6:07 PM, Ray Racine &lt;<a href="mailto:ray.racine@gmail.com" target="_blank">ray.racine@gmail.com</a>&gt; wrote:<br>

&gt;&gt; #lang typed/racket/base<br>&gt;&gt;<br>&gt;&gt; ;; Inputs<br>&gt;&gt; (define-type (Stream D) (U (Datum D) &#39;Nothing &#39;EOS))<br>&gt;&gt; (struct: (D) Datum ([iota : D]))<br>&gt;&gt;<br>&gt;&gt; ;; Iteratee<br>

&gt;&gt; (define-type (Iteratee D A) (U (Done D A) (Continuation D A)))<br>&gt;&gt; (struct: (D A) Done ([accum : A] [stream : (Stream D)]))<br>&gt;&gt; (struct: (D A) Continuation ([resume : ((Stream D) -&gt; (Iteratee D A))]))<br>

&gt;&gt;<br>&gt;&gt; 1.  How can I get the recursive nature of Iteratee and Continuation to type<br>&gt;&gt; check?<br>&gt;&gt; 2.  Ideally, but not necessary, like to define Continuation as a<br>&gt;&gt; define-struct/exec:<br>

&gt;&gt;<br>&gt;&gt; Thanks,<br>&gt;&gt;<br>&gt;&gt; Ray<br>&gt;
</div></div></blockquote></div><br></div>