<div dir="ltr">To be sure: Is there any TR analog to this OCaml code, initializing a cyclic, 3-element list? I've tried using letrec in TR, but the typechecker yells at me even if I annotate the a,b,c,d.<div><br></div><div><div><font face="courier new, monospace"># type 'a mylist = Nil | Cons of 'a * 'a mylist;;</font></div><div><font face="courier new, monospace">type 'a mylist = Nil | Cons of 'a * 'a mylist</font></div><div><font face="courier new, monospace"># let mylist =</font></div><div><font face="courier new, monospace">    let rec a = Cons(1, b)</font></div><div><font face="courier new, monospace">    and     b = Cons(2, c)</font></div><div><font face="courier new, monospace">    and     c = Cons(3, d)</font></div><div><font face="courier new, monospace">    and     d = Cons(4, a) in</font></div><div><font face="courier new, monospace">    a;;</font></div><div><font face="courier new, monospace">val mylist : int mylist = Cons (1, Cons (2, Cons (3, Cons (4, <cycle>))))</font></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 29, 2014 at 12:52 PM, Sam Tobin-Hochstadt <span dir="ltr"><<a href="mailto:samth@cs.indiana.edu" target="_blank">samth@cs.indiana.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ah, if you want to create truly cyclic structure with no base case<br>
like this, then you'll have to do more work. Either you'll need to<br>
expand the type of the `x` field in `foo` to allow an initial value,<br>
or you'll need to create a dummy `foo` with that extended type, and<br>
then copy the cyclic data once you've created it to a new version of<br>
`foo`, using hash tables to track cycles. That's basically how<br>
`shared` works, although I haven't tried implementing it in TR and it<br>
might not be possible.<br>
<span class="HOEnZb"><font color="#888888"><br>
Sam<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
On Mon, Sep 29, 2014 at 12:33 PM, Konrad Hinsen<br>
<<a href="mailto:konrad.hinsen@fastmail.net">konrad.hinsen@fastmail.net</a>> wrote:<br>
> Sam Tobin-Hochstadt writes:<br>
><br>
>  > I recommend doing the mutation yourself, and not using `shared`.<br>
>  > That's the most obvious solution.<br>
><br>
> Not for me, unfortunately, but probably I am missing something<br>
> obvious.<br>
><br>
> Here's explicit mutation in untyped Racket:<br>
><br>
>    #lang racket<br>
><br>
>    (struct foo (x) #:mutable)<br>
>    (struct bar (x))<br>
><br>
>    (define f (foo (void)))<br>
>    (define b (bar f))<br>
>    (set-foo-x! f b)<br>
><br>
>    (eq? (bar-x b) f)<br>
>    (eq? (foo-x f) b)<br>
><br>
> That works fine. Moving to Typed Racket, this is rejected by the type<br>
> checker because (void) is of type Void.  Since I need a bar to make a<br>
> foo and a foo to make a bar, I don't see how I can ever initialize my<br>
> foo structure.<br>
><br>
>  > The reason that your `require/typed` doesn't work is that it creates<br>
>  > new versions of the placeholder functions, but those aren't the ones<br>
>  > that `shared` uses internally, so Typed Racket doesn't use the types<br>
>  > you've given.<br>
><br>
> That makes sense, thanks for the explanation!<br>
><br>
> Konrad.<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br></div>