<p dir="ltr"></p>
<p dir="ltr">On Thu, Nov 1, 2012 at 4:56 PM, John Clements &lt;<a href="mailto:clements@brinckerhoff.org">clements@brinckerhoff.org</a>&gt; wrote:<br>
&gt; I can&#39;t tell whether this is a bug. In the program below, remove-duplicates doesn&#39;t remove duplicates. This looks like an attempt to preserve parametricity a la theorems for free, but I don&#39;t think that TR actually tries to guarantee parametricity in this sense. I&#39;m guessing that the values in the list are being wrapped in contracts that prevent &#39;eq?&#39;-checking; I thought that chaperones were supposed to... no, I shouldn&#39;t even finish that sentence.</p>

<p dir="ltr">Typed Racket indeed doesn&#39;t guarantee parametricity for typed programs, but the wrapping is necessary to preserve type soundness of typed programs. Consider this program:</p>
<p dir="ltr">#lang typed/racket<br>
(require/typed &#39;somewhere<br>
[f (All (A) (A -&gt; A))])</p>
<p dir="ltr">(: z : One)<br>
(define z (add1 ((inst f Zero) 0)))</p>
<p dir="ltr">Since we can pick whatever type we want for a particular instantiation of `f`, we have to make sure that no matter what sort of things we hand to `f`, it gives only those sorts of things back. Since the contract has no way to know which type you wanted, the only way it can ensure that the &quot;same sort of things&quot; are produced is to make sure that they are actually the same things.</p>

<p dir="ltr">This is implemented by wrapping the values, which additionally enforces parametricity on the untyped code, but that isn&#39;t the goal.</p>
<p dir="ltr"> Sam</p>
<p dir="ltr">&gt;<br>
&gt; Anyhow, I&#39;m just writing to make sure that this isn&#39;t a bug. It&#39;s certainly not the behavior that I would naively expect. I can certainly work around the bug by substituting a more specific type for remove-duplicates, as in the commented-out version.<br>

&gt;<br>
&gt; John<br>
&gt;<br>
&gt; #lang typed/racket<br>
&gt;<br>
&gt; (require/typed racket<br>
&gt; [remove-duplicates (All (T) (Listof T) -&gt; (Listof T))]<br>
&gt; #;[remove-duplicates ((Listof Symbol) -&gt; (Listof Symbol))])<br>
&gt;<br>
&gt; (remove-duplicates &#39;(a b c a d)) ;; =&gt; produces &#39;(a b c a d)--that is, a list with duplicates<br>
&gt;<br>
&gt;<br>
&gt; ____________________<br>
&gt; Racket Users list:<br>
&gt; <a href="http://lists.racket-lang.org/users">http://lists.racket-lang.org/users</a><br>
&gt;<br><br></p>
<p dir="ltr">--<br>
sam th<br>
<a href="mailto:samth@ccs.neu.edu">samth@ccs.neu.edu</a></p>