[racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread Neil Toronto

#lang typed/racket

(: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
(define (vector-first vs)
  (vector-ref vs 0))


I can't think of a reason this shouldn't work, but I may not be taxing 
my imagination enough to come up with one.


Neil ⊥
_
 Racket Developers list:
 http://lists.racket-lang.org/dev


Re: [racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread J. Ian Johnson
How do you determine the difference between the two vector types is the 
question...
-Ian
- Original Message -
From: Neil Toronto neil.toro...@gmail.com
To: dev@racket-lang.org dev@racket-lang.org
Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern
Subject: [racket-dev] Should I expect this program to typecheck?

#lang typed/racket

(: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
(define (vector-first vs)
   (vector-ref vs 0))


I can't think of a reason this shouldn't work, but I may not be taxing 
my imagination enough to come up with one.

Neil ⊥
_
  Racket Developers list:
  http://lists.racket-lang.org/dev

_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread Neil Toronto
I can't distinguish the elements' types in the simplified example I 
gave. The code I'm actually working on is this:


(: check-array-indexes (Symbol (Vectorof Index)
   (U (Vectorof Index) (Vectorof Integer))
   - (Vectorof Index)))
(define (check-array-indexes name ds js)
  (define (raise-index-error)
(error name expected indexes for shape ~e; given ~e ds js))
  (define dims (vector-length ds))
  (unless (= dims (vector-length js)) (raise-index-error))
  (define: new-js : (Vectorof Index) (make-vector dims 0))
  (let loop ([#{i : Nonnegative-Fixnum} 0])
(cond [(i .  . dims)
   (define di (vector-ref ds i))
   (define ji (vector-ref js i))
   (cond [(and (0 . = . ji) (ji .  . di))
  (vector-set! new-js i ji)
  (loop (+ i 1))]
 [else  (raise-index-error)])]
  [else  new-js])))

I get type errors on every expression involving `ji', because TR has 
determined that it has type `Any'.


I would use a `case-' type, but I have an array transformation function 
that receives an argument with type


  ((Vectorof Index) - (U (Vectorof Integer) (Vectorof Index)))

whose output has to be bounds-checked by `check-array-indexes', and I 
can't apply a function with a case type to an argument with a union type.


The question will of course be moot when TR has something like a `Const' 
type constructor. I'm anticipating that, and changing the user-facing 
array API to receive (U (Vectorof Integer) (Vectorof Index)) for array 
indexes instead of (Listof Integer). (It should eventually be (Const 
(Vectorof Integer)) or similar, which should be covariant.)


So are the type errors an error in TR, or a known limitation?

Neil ⊥


On 08/06/2012 02:25 PM, J. Ian Johnson wrote:

How do you determine the difference between the two vector types is the 
question...
-Ian
- Original Message -
From: Neil Toronto neil.toro...@gmail.com
To: dev@racket-lang.org dev@racket-lang.org
Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern
Subject: [racket-dev] Should I expect this program to typecheck?

#lang typed/racket

(: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
(define (vector-first vs)
(vector-ref vs 0))


I can't think of a reason this shouldn't work, but I may not be taxing
my imagination enough to come up with one.

Neil ⊥
_
   Racket Developers list:
   http://lists.racket-lang.org/dev



_
 Racket Developers list:
 http://lists.racket-lang.org/dev


Re: [racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread J. Ian Johnson
I don't get the type Any, rather it doesn'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).
-Ian
- Original Message -
From: Neil Toronto neil.toro...@gmail.com
To: J. Ian Johnson i...@ccs.neu.edu
Cc: dev dev@racket-lang.org
Sent: Monday, August 6, 2012 5:07:38 PM GMT -05:00 US/Canada Eastern
Subject: Re: [racket-dev] Should I expect this program to typecheck?

I can't distinguish the elements' types in the simplified example I 
gave. The code I'm actually working on is this:

(: check-array-indexes (Symbol (Vectorof Index)
(U (Vectorof Index) (Vectorof Integer))
- (Vectorof Index)))
(define (check-array-indexes name ds js)
   (define (raise-index-error)
 (error name expected indexes for shape ~e; given ~e ds js))
   (define dims (vector-length ds))
   (unless (= dims (vector-length js)) (raise-index-error))
   (define: new-js : (Vectorof Index) (make-vector dims 0))
   (let loop ([#{i : Nonnegative-Fixnum} 0])
 (cond [(i .  . dims)
(define di (vector-ref ds i))
(define ji (vector-ref js i))
(cond [(and (0 . = . ji) (ji .  . di))
   (vector-set! new-js i ji)
   (loop (+ i 1))]
  [else  (raise-index-error)])]
   [else  new-js])))

I get type errors on every expression involving `ji', because TR has 
determined that it has type `Any'.

I would use a `case-' type, but I have an array transformation function 
that receives an argument with type

   ((Vectorof Index) - (U (Vectorof Integer) (Vectorof Index)))

whose output has to be bounds-checked by `check-array-indexes', and I 
can't apply a function with a case type to an argument with a union type.

The question will of course be moot when TR has something like a `Const' 
type constructor. I'm anticipating that, and changing the user-facing 
array API to receive (U (Vectorof Integer) (Vectorof Index)) for array 
indexes instead of (Listof Integer). (It should eventually be (Const 
(Vectorof Integer)) or similar, which should be covariant.)

So are the type errors an error in TR, or a known limitation?

Neil ⊥


On 08/06/2012 02:25 PM, J. Ian Johnson wrote:
 How do you determine the difference between the two vector types is the 
 question...
 -Ian
 - Original Message -
 From: Neil Toronto neil.toro...@gmail.com
 To: dev@racket-lang.org dev@racket-lang.org
 Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern
 Subject: [racket-dev] Should I expect this program to typecheck?

 #lang typed/racket

 (: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
 (define (vector-first vs)
 (vector-ref vs 0))


 I can't think of a reason this shouldn't work, but I may not be taxing
 my imagination enough to come up with one.

 Neil ⊥
 _
Racket Developers list:
http://lists.racket-lang.org/dev



_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread Ray Racine
This type checks.  Not sure if it is the same thing as the original
however.

(: check-array-indexes (Symbol
(Vectorof Index)
(U (Vectorof Index) (Vectorof Integer))
- (Vectorof Index)))
(define (check-array-indexes name ds js)

  (define (raise-index-error)
(error name expected indexes for shape ~e; given ~e ds js))

  (: dims Integer)
  (define dims (vector-length ds))

  (unless (= dims (vector-length js)) (raise-index-error))

  (: new-js (Vectorof Index))
  (define new-js (make-vector dims 0))

  (let: loop : (Vectorof Index) ([i : Integer 0])
(if ( i dims)
(let: ((di : Index   (vector-ref ds i))
   (ji : Integer (assert (vector-ref js i) exact-integer?)))
  (if (and (= 0 ji)
   ( ji di))
  (begin
(vector-set! new-js i (assert ji index?))
(loop (add1 i)))
  (raise-index-error)))
new-js)))

On Mon, Aug 6, 2012 at 5:47 PM, J. Ian Johnson i...@ccs.neu.edu wrote:

 I don't get the type Any, rather it doesn'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).
 -Ian
 - Original Message -
 From: Neil Toronto neil.toro...@gmail.com
 To: J. Ian Johnson i...@ccs.neu.edu
 Cc: dev dev@racket-lang.org
 Sent: Monday, August 6, 2012 5:07:38 PM GMT -05:00 US/Canada Eastern
 Subject: Re: [racket-dev] Should I expect this program to typecheck?

 I can't distinguish the elements' types in the simplified example I
 gave. The code I'm actually working on is this:

 (: check-array-indexes (Symbol (Vectorof Index)
 (U (Vectorof Index) (Vectorof Integer))
 - (Vectorof Index)))
 (define (check-array-indexes name ds js)
(define (raise-index-error)
  (error name expected indexes for shape ~e; given ~e ds js))
(define dims (vector-length ds))
(unless (= dims (vector-length js)) (raise-index-error))
(define: new-js : (Vectorof Index) (make-vector dims 0))
(let loop ([#{i : Nonnegative-Fixnum} 0])
  (cond [(i .  . dims)
 (define di (vector-ref ds i))
 (define ji (vector-ref js i))
 (cond [(and (0 . = . ji) (ji .  . di))
(vector-set! new-js i ji)
(loop (+ i 1))]
   [else  (raise-index-error)])]
[else  new-js])))

 I get type errors on every expression involving `ji', because TR has
 determined that it has type `Any'.

 I would use a `case-' type, but I have an array transformation function
 that receives an argument with type

((Vectorof Index) - (U (Vectorof Integer) (Vectorof Index)))

 whose output has to be bounds-checked by `check-array-indexes', and I
 can't apply a function with a case type to an argument with a union type.

 The question will of course be moot when TR has something like a `Const'
 type constructor. I'm anticipating that, and changing the user-facing
 array API to receive (U (Vectorof Integer) (Vectorof Index)) for array
 indexes instead of (Listof Integer). (It should eventually be (Const
 (Vectorof Integer)) or similar, which should be covariant.)

 So are the type errors an error in TR, or a known limitation?

 Neil ⊥


 On 08/06/2012 02:25 PM, J. Ian Johnson wrote:
  How do you determine the difference between the two vector types is the
 question...
  -Ian
  - Original Message -
  From: Neil Toronto neil.toro...@gmail.com
  To: dev@racket-lang.org dev@racket-lang.org
  Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern
  Subject: [racket-dev] Should I expect this program to typecheck?
 
  #lang typed/racket
 
  (: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
  (define (vector-first vs)
  (vector-ref vs 0))
 
 
  I can't think of a reason this shouldn't work, but I may not be taxing
  my imagination enough to come up with one.
 
  Neil ⊥
  _
 Racket Developers list:
 http://lists.racket-lang.org/dev
 


 _
   Racket Developers list:
   http://lists.racket-lang.org/dev

_
  Racket Developers list:
  http://lists.racket-lang.org/dev


Re: [racket-dev] Should I expect this program to typecheck?

2012-08-06 Thread Eric Dobson
#lang typed/racket

(: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
(define (vector-first vs)
  (vector-ref vs 0))

I doubt this will typecheck without more work in the typechecker. The
issue is that it should work for a union type of as many vectors as
you want.

If there was a readable-vector type it would be trivial as subtyping
would do all of the real work. As (U (ReadVector A) (ReadVector B)) :
(ReadVector (U A B)). But that cannot be done with real vectors, as
they are invariant.




On Mon, Aug 6, 2012 at 5:15 PM, Ray Racine ray.rac...@gmail.com wrote:

 This type checks.  Not sure if it is the same thing as the original
 however.

 (: check-array-indexes (Symbol
 (Vectorof Index)
 (U (Vectorof Index) (Vectorof Integer))
 - (Vectorof Index)))
 (define (check-array-indexes name ds js)

   (define (raise-index-error)
 (error name expected indexes for shape ~e; given ~e ds js))

   (: dims Integer)
   (define dims (vector-length ds))

   (unless (= dims (vector-length js)) (raise-index-error))

   (: new-js (Vectorof Index))
   (define new-js (make-vector dims 0))

   (let: loop : (Vectorof Index) ([i : Integer 0])
 (if ( i dims)
 (let: ((di : Index   (vector-ref ds i))
(ji : Integer (assert (vector-ref js i) exact-integer?)))
   (if (and (= 0 ji)
( ji di))
   (begin
 (vector-set! new-js i (assert ji index?))
 (loop (add1 i)))
   (raise-index-error)))
 new-js)))

 On Mon, Aug 6, 2012 at 5:47 PM, J. Ian Johnson i...@ccs.neu.edu wrote:

 I don't get the type Any, rather it doesn'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).
 -Ian
 - Original Message -
 From: Neil Toronto neil.toro...@gmail.com
 To: J. Ian Johnson i...@ccs.neu.edu
 Cc: dev dev@racket-lang.org
 Sent: Monday, August 6, 2012 5:07:38 PM GMT -05:00 US/Canada Eastern
 Subject: Re: [racket-dev] Should I expect this program to typecheck?

 I can't distinguish the elements' types in the simplified example I
 gave. The code I'm actually working on is this:

 (: check-array-indexes (Symbol (Vectorof Index)
 (U (Vectorof Index) (Vectorof Integer))
 - (Vectorof Index)))
 (define (check-array-indexes name ds js)
(define (raise-index-error)
  (error name expected indexes for shape ~e; given ~e ds js))
(define dims (vector-length ds))
(unless (= dims (vector-length js)) (raise-index-error))
(define: new-js : (Vectorof Index) (make-vector dims 0))
(let loop ([#{i : Nonnegative-Fixnum} 0])
  (cond [(i .  . dims)
 (define di (vector-ref ds i))
 (define ji (vector-ref js i))
 (cond [(and (0 . = . ji) (ji .  . di))
(vector-set! new-js i ji)
(loop (+ i 1))]
   [else  (raise-index-error)])]
[else  new-js])))

 I get type errors on every expression involving `ji', because TR has
 determined that it has type `Any'.

 I would use a `case-' type, but I have an array transformation function
 that receives an argument with type

((Vectorof Index) - (U (Vectorof Integer) (Vectorof Index)))

 whose output has to be bounds-checked by `check-array-indexes', and I
 can't apply a function with a case type to an argument with a union type.

 The question will of course be moot when TR has something like a `Const'
 type constructor. I'm anticipating that, and changing the user-facing
 array API to receive (U (Vectorof Integer) (Vectorof Index)) for array
 indexes instead of (Listof Integer). (It should eventually be (Const
 (Vectorof Integer)) or similar, which should be covariant.)

 So are the type errors an error in TR, or a known limitation?

 Neil ⊥


 On 08/06/2012 02:25 PM, J. Ian Johnson wrote:
  How do you determine the difference between the two vector types is the
  question...
  -Ian
  - Original Message -
  From: Neil Toronto neil.toro...@gmail.com
  To: dev@racket-lang.org dev@racket-lang.org
  Sent: Monday, August 6, 2012 4:12:53 PM GMT -05:00 US/Canada Eastern
  Subject: [racket-dev] Should I expect this program to typecheck?
 
  #lang typed/racket
 
  (: vector-first (All (A B) ((U (Vectorof A) (Vectorof B)) - (U A B
  (define (vector-first vs)
  (vector-ref vs 0))
 
 
  I can't think of a reason this shouldn't work, but I may not be taxing
  my imagination enough to come up with one.
 
  Neil ⊥
  _
 Racket Developers list:
 http://lists.racket-lang.org/dev
 


 _
   Racket Developers list:
   http://lists.racket-lang.org/dev



 _
   Racket Developers list:
   http://lists.racket