Nice.  Thank you.<br><br>On Thursday, July 19, 2012, Carl Eastlund &lt;<a href="mailto:cce@ccs.neu.edu">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">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;