On 11/19/2012 04:43 AM, Pierpaolo Bernardi wrote:
#lang typed/racket

(define-type (Array a) (Rec AA (U (Vectorof a) (Vectorof AA))))

(: make-array (All (a) ((Listof Positive-Index) a -> (Array a))))

(define (make-array dims init)
   (let loop ((dims dims))
     (match dims
       ((list first)
        (make-vector first init))
       ((list-rest first rest)
        (let ((v (make-vector first)))
          (for ((i (in-range first)))
            (vector-set! v i (loop rest)))
          v)))))

When `make-vector' is given one argument, it constructs a (Vectorof Integer), namely #(0 0 0 ...). In this case you need to construct it with the type (Vectorof (Array a)).

This works for me, on 5.3.1:

  (let: ((v : (Vectorof (Array a)) (make-vector first (vector init))))
    ...)

Also, you should know that with a recursive type like that, you'll often have a hard time convincing TR that you're dealing with a base case in a particular loop iteration. You may end up passing predicates around to identify instances of the type `a'.

If you want to know whether you'll have trouble, try writing `array-flatten', with this type:

  (All (a) ((Array a) -> (Vectorof a)))

If you can't, try this type:

  (All (a) ((Array a) (Any -> Boolean : a) -> (Vectorof a)))

which is for an `array-flatten' that additionally accepts a predicate as an argument.

Neil ⊥

____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to