<br><div>This type checks.  Not sure if it is the &quot;same thing&quot; as the original however.</div><div><br></div><div>(: check-array-indexes (Symbol </div><div>                        (Vectorof Index)</div><div>                        (U (Vectorof Index) (Vectorof Integer))</div>
<div>                        -&gt; (Vectorof Index)))</div><div>(define (check-array-indexes name ds js)</div><div>  </div><div>  (define (raise-index-error)</div><div>    (error name &quot;expected indexes for shape ~e; given ~e&quot; ds js))</div>
<div>  </div><div>  (: dims Integer)</div><div>  (define dims (vector-length ds))</div><div>  </div><div>  (unless (= dims (vector-length js)) (raise-index-error))</div><div>  </div><div>  (: new-js (Vectorof Index))</div>
<div>  (define new-js (make-vector dims 0))</div><div>  </div><div>  (let: loop : (Vectorof Index) ([i : Integer 0])</div><div>    (if (&lt; i dims)</div><div>        (let: ((di : Index   (vector-ref ds i))</div><div>               (ji : Integer (assert (vector-ref js i) exact-integer?)))</div>
<div>          (if (and (&lt;= 0 ji)  </div><div>                   (&lt; ji di))</div><div>              (begin</div><div>                (vector-set! new-js i (assert ji index?))</div><div>                (loop (add1 i)))</div>
<div>              (raise-index-error)))</div><div>        new-js)))</div><div><br></div><div class="gmail_quote">On Mon, Aug 6, 2012 at 5:47 PM, J. Ian Johnson <span dir="ltr">&lt;<a href="mailto:ianj@ccs.neu.edu" target="_blank">ianj@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I don&#39;t get the type Any, rather it doesn&#39;t know how to go from the union of vectors to a (vector a) for some a. Vector ref expects a vector, not a union of vectors, and because vectors are invariant, it cannot simplify this to (vector Integer).<br>

<div class="im HOEnZb">-Ian<br>
----- Original Message -----<br>
From: &quot;Neil Toronto&quot; &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt;<br>
</div><div class="HOEnZb"><div class="h5">To: &quot;J. Ian Johnson&quot; &lt;<a href="mailto:ianj@ccs.neu.edu">ianj@ccs.neu.edu</a>&gt;<br>
Cc: &quot;dev&quot; &lt;<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>&gt;<br>
Sent: Monday, August 6, 2012 5:07:38 PM GMT -05:00 US/Canada Eastern<br>
Subject: Re: [racket-dev] Should I expect this program to typecheck?<br>
<br>
I can&#39;t distinguish the elements&#39; types in the simplified example I<br>
gave. The code I&#39;m actually working on is this:<br>
<br>
(: check-array-indexes (Symbol (Vectorof Index)<br>
                                (U (Vectorof Index) (Vectorof Integer))<br>
                                -&gt; (Vectorof Index)))<br>
(define (check-array-indexes name ds js)<br>
   (define (raise-index-error)<br>
     (error name &quot;expected indexes for shape ~e; given ~e&quot; ds js))<br>
   (define dims (vector-length ds))<br>
   (unless (= dims (vector-length js)) (raise-index-error))<br>
   (define: new-js : (Vectorof Index) (make-vector dims 0))<br>
   (let loop ([#{i : Nonnegative-Fixnum} 0])<br>
     (cond [(i . &lt; . dims)<br>
            (define di (vector-ref ds i))<br>
            (define ji (vector-ref js i))<br>
            (cond [(and (0 . &lt;= . ji) (ji . &lt; . di))<br>
                   (vector-set! new-js i ji)<br>
                   (loop (+ i 1))]<br>
                  [else  (raise-index-error)])]<br>
           [else  new-js])))<br>
<br>
I get type errors on every expression involving `ji&#39;, because TR has<br>
determined that it has type `Any&#39;.<br>
<br>
I would use a `case-&gt;&#39; type, but I have an array transformation function<br>
that receives an argument with type<br>
<br>
   ((Vectorof Index) -&gt; (U (Vectorof Integer) (Vectorof Index)))<br>
<br>
whose output has to be bounds-checked by `check-array-indexes&#39;, and I<br>
can&#39;t apply a function with a case type to an argument with a union type.<br>
<br>
The question will of course be moot when TR has something like a `Const&#39;<br>
type constructor. I&#39;m anticipating that, and changing the user-facing<br>
array API to receive (U (Vectorof Integer) (Vectorof Index)) for array<br>
indexes instead of (Listof Integer). (It should eventually be (Const<br>
(Vectorof Integer)) or similar, which should be covariant.)<br>
<br>
So are the type errors an error in TR, or a known limitation?<br>
<br>
Neil ⊥<br>
<br>
<br>
On 08/06/2012 02:25 PM, J. Ian Johnson wrote:<br>
&gt; How do you determine the difference between the two vector types is the question...<br>
&gt; -Ian<br>
&gt; ----- Original Message -----<br>
&gt; From: &quot;Neil Toronto&quot; &lt;<a href="mailto:neil.toronto@gmail.com">neil.toronto@gmail.com</a>&gt;<br>
&gt; To: &quot;&lt;<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>&gt;&quot; &lt;<a href="mailto:dev@racket-lang.org">dev@racket-lang.org</a>&gt;<br>
&gt; Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern<br>
&gt; Subject: [racket-dev] Should I expect this program to typecheck?<br>
&gt;<br>
&gt; #lang typed/racket<br>
&gt;<br>
&gt; (: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) -&gt; (U A B))))<br>
&gt; (define (vector-first vs)<br>
&gt;     (vector-ref vs 0))<br>
&gt;<br>
&gt;<br>
&gt; I can&#39;t think of a reason this shouldn&#39;t work, but I may not be taxing<br>
&gt; my imagination enough to come up with one.<br>
&gt;<br>
&gt; Neil ⊥<br>
&gt; _________________________<br>
&gt;    Racket Developers list:<br>
&gt;    <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
&gt;<br>
<br>
<br>
_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
</div></div></blockquote></div><br>