[racket] TR: typechecking for*/and
The `for*` loops' expansion is not typechecker-friendly at all, so there
are a lot of cases where they won't work in TR.
In this particular case, there is no more type information you could
add, which makes the error message really misleading. Inference is not
currently able to distinguish these "hopeless" cases from more routine
ones, which is part of the problem.
Using `for*/fold` instead of `for*/and` works in this case. It's not as
nice as the original, I agree, but it's a workaround.
The good news is, Asumu is reimplementing the TR `for` loops to play
more nicely with the typechecker. This should hopefully solve this
problem, and more. I don't know what the timeframe for that work
landing is, though.
Vincent
At Fri, 6 Feb 2015 18:04:56 -0800,
Matthew Butterick wrote:
>
> The first three loops typecheck as expected, but the fourth, using for*/and with two bindings, does not. What is missing?
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
> #lang typed/racket
>
> (for*/sum : Integer
> ([i : Integer (in-range 10)])
> 1)
>
> ;; 10
>
> (for*/and : Boolean
> ([i : Integer (in-range 10)])
> #t)
>
> ;; #t
>
> (for*/sum : Integer
> ([i : Integer (in-range 10)]
> [j : Integer (in-range 10)])
> 1)
>
> ;; 100
>
> (for*/and : Boolean
> ([i : Integer (in-range 10)]
> [j : Integer (in-range 10)])
> #t)
>
> ;; Error in macro expansion -- insufficient type information to typecheck
>
>
> ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users