<p>I&#39;m confused, Sam.  Is the example with the indirect struct less problematic somehow?  Or should it be failing?</p>
<p>Carl Eastlund</p>
<p>--<br>
WARNING!  Poorly-typed cell phone email precedes.</p>
<div class="gmail_quote">On Apr 11, 2013 7:23 AM, &quot;Sam Tobin-Hochstadt&quot; &lt;<a href="mailto:samth@ccs.neu.edu">samth@ccs.neu.edu</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
The reason this doesn&#39;t work is that non-regular datatypes require<br>
significantly more algorithmic complexity to avoid non-termination/be<br>
correct. In particular, I don&#39;t know of a subtyping algorithm for<br>
non-regular datatypes.<br>
<br>
Sam<br>
<br>
On Thu, Apr 11, 2013 at 12:58 AM, Eric Dobson &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt; wrote:<br>
&gt; So it looks like that you need an indirection struct, here is a simple example.<br>
&gt;<br>
&gt; #lang typed/racket<br>
&gt;<br>
&gt;<br>
&gt; (struct: (a) Indirect ((v : (Deep a))))<br>
&gt; (struct: (a) Deep ((spine : (Indirect (List a)))))<br>
&gt; ;(struct: (a) Deep ((spine : (Deep (List a)))))<br>
&gt;<br>
&gt; The uncommented version typechecks, but the commented one does not. I<br>
&gt; understand why this works in the implementation, but don&#39;t know the<br>
&gt; theoretical reason why the implementation prevents it, since Indirect<br>
&gt; and Deep should be isomorphic.<br>
&gt;<br>
&gt; On Wed, Apr 10, 2013 at 9:43 PM, Eric Dobson &lt;<a href="mailto:eric.n.dobson@gmail.com">eric.n.dobson@gmail.com</a>&gt; wrote:<br>
&gt;&gt; Quick answer is to replace<br>
&gt;&gt; (define-type (Fingertree a) (U Empty (Single a) (Deep a)))<br>
&gt;&gt; With<br>
&gt;&gt; (struct: (a) Fingertree ((v : (U Empty (Single a) (Deep a)))))<br>
&gt;&gt;<br>
&gt;&gt; Still looking into understanding what is going on, but I believe you<br>
&gt;&gt; will need to introduce a Rec somewhere to get it how you want.<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Apr 10, 2013 at 6:27 PM, Anthony Carrico &lt;<a href="mailto:acarrico@memebeam.org">acarrico@memebeam.org</a>&gt; wrote:<br>
&gt;&gt;&gt; I&#39;ve been reading about fingertrees, and I figure the best way to<br>
&gt;&gt;&gt; understand is to implement. This is my first experience with typed<br>
&gt;&gt;&gt; racket. Are nested datatypes supported?<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; This is my first try:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; typed-fingertree.rkt:19:48: Type Checker: Structure type constructor<br>
&gt;&gt;&gt; Deep applied to non-regular arguments ((U (Node2 a) (Node3 a)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; #lang typed/racket<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (struct: (a) Digit1 ((v0 : a)))<br>
&gt;&gt;&gt; (struct: (a) Digit2 ((v0 : a) (v1 : a)))<br>
&gt;&gt;&gt; (struct: (a) Digit3 ((v0 : a) (v1 : a) (v2 : a)))<br>
&gt;&gt;&gt; (struct: (a) Digit4 ((v0 : a) (v1 : a) (v2 : a) (v3 : a)))<br>
&gt;&gt;&gt; (define-type (Digit a) (U (Digit1 a) (Digit2 a) (Digit3 a) (Digit4 a)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (struct: (a) Node2 ((v0 : a) (v1 : a)))<br>
&gt;&gt;&gt; (struct: (a) Node3 ((v0 : a) (v1 : a) (v2 : a)))<br>
&gt;&gt;&gt; (define-type (Node a) (U (Node2 a) (Node3 a)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (struct: Empty ())<br>
&gt;&gt;&gt; (struct: (a) Single ((v : a)))<br>
&gt;&gt;&gt; (struct: (a) Deep ((left : (Digit a))<br>
&gt;&gt;&gt;                    (spine : (Fingertree (Node a)))<br>
&gt;&gt;&gt;                    (right : (Digit a))))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; (define-type (Fingertree a) (U Empty (Single a) (Deep a)))<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thank you!<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; --<br>
&gt;&gt;&gt; Anthony Carrico<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; ____________________<br>
&gt;&gt;&gt;   Racket Users list:<br>
&gt;&gt;&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
&gt;&gt;&gt;<br>
&gt; ____________________<br>
&gt;   Racket Users list:<br>
&gt;   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</blockquote></div>