[racket] TR+plot exposes idx9, idx54, etc?

From: Neil Toronto (neil.toronto at gmail.com)
Date: Tue Apr 8 16:36:11 EDT 2014

On 04/08/2014 02:21 PM, John Clements wrote:
>
> On Apr 8, 2014, at 12:04 PM, John Clements <clements at brinckerhoff.org> wrote:
>
>>
>> On Apr 8, 2014, at 11:54 AM, Sam Tobin-Hochstadt <samth at cs.indiana.edu> wrote:
>>
>>> On Tue, Apr 8, 2014 at 2:48 PM, John Clements <clements at brinckerhoff.org> wrote:
>>>> Here’s a short piece of code that tries to plot an array:
>>>>
>>>> #lang typed/racket
>>>>
>>>> (require plot
>>>>         math/array)
>>>>
>>>> (define fft-maxes (array #[3.2 978.9 -2397]))
>>>>
>>>> (: with-indexes (Vectorof (Vector Nonnegative-Integer Real)))
>>>> (define with-indexes
>>>> (for/vector : (Vectorof (Vector Nonnegative-Integer Real))
>>>>    ([i : Nonnegative-Integer (in-naturals)]
>>>>     [a (in-array fft-maxes)])
>>>>    (ann (vector (ann i Nonnegative-Integer) a)
>>>>         (Vector Nonnegative-Integer Real))))
>>>>
>>>>
>>>> (plot (lines (in-vector with-indexes)))
>>>>
>>>> I have two questions.
>>>> 1) Is there an easier way to pair an array with indices? This was kind of challenging.
>>>
>>> Try `in-indexed`.
>>
>> But… in-indexed produces a sequence of 2-value elements. I guess I can get it working with sequence-map:
>>
>> (plot (lines (sequence-map (lambda (a b) (vector b a))
>>                            (in-indexed (in-array fft-maxes)))))
>>
>> BUT WAIT! no, that doesn’t work in the typed setting, because sequence-map’s type doesn’t work for 2-valued sequences. Back to square 1.
>
> Got it… “in-values-sequence”.
>
> John

Four more options:

(plot (lines (for/list : (Listof (List Index Real))
                  ([js  (in-array-indexes (array-shape fft-maxes))]
                   [x   (in-array fft-maxes)])
                (list (vector-ref js 0) x))))


(plot (lines (array->list
               (array-map (λ ([js : Indexes] [x : Real])
                            (list (vector-ref js 0) x))
                          (indexes-array (array-shape fft-maxes))
                          fft-maxes))))

(plot (lines
        (matrix->list*
         (list-array->array
          (for/array ([js  (in-array-indexes (array-shape fft-maxes))]
                      [x   (in-array fft-maxes)]) : (List Index Real)
                     (list (vector-ref js 0) x))
          1))))

(plot (lines (matrix->list*
               (array-list->array
                (list (build-array (array-shape fft-maxes)
                                   (λ ([js : Indexes])
                                     (vector-ref js 0)))
                      fft-maxes)
                1))))

The last two use `matrix->list*' because there's no way for TR to prove 
that `array->list*' produces a (Listof (Listof t)). (Nothing about an 
array's shape is part of the type.)

Neil ⊥


Posted on the users mailing list.