# [plt-scheme] for comprehensions in typed-scheme

Noel, Sam is trying to imitate ML's bad type error messages and I am
afraid he's succeeding all too well. Sorry.
In your case, you need to read the error message as
max consumes at least one number and a possible empty sequence of
additional numbers.
You,
the programmer, is trying to make max compute the maximum of a list
of numbers, via apply.
But silly, don't you know that lists can be empty?!!
Here is another way of saying this:
>* #lang typed-scheme
*>*
*>* (: f ((Listof Number) -> Number))
*>* (define (f y)
*>* (define x (apply max (car y) (cdr y)))
*>* x)
*
Of course note that (car y) does NOT signal a type error. The typed
language has turned the potential error of computing the max from a
compile time type error into a run-time check/error -- QUIETLY.
Aren't typed languages beautiful?
On Jun 8, 2009, at 9:54 AM, Noel Welsh wrote:
>* On Mon, Jun 8, 2009 at 1:45 PM, Sam TH<samth at ccs.neu.edu> wrote:
*>>* This works:
*>*
*>* Groovy.
*>*
*>* Next dumb question:
*>*
*>* (define-struct: Mark ())
*>* (define-struct: (Dot Mark) ([x : Number] [y : Number]))
*>*
*>* (: bounding-box ((Listof Dot) -> Box))
*>* (define (bounding-box marks)
*>* ;; This only works for Dots. It should work for all Marks
*>* (define: xs : (Listof Number) (map Dot-x marks))
*>* (define: ys : (Listof Number) (map Dot-y marks))
*>* (define: max-x : Number (#{apply @ Number Number} max xs))
*>* (define: max-y : Number (apply max ys))
*>* (define: min-x : Number (apply min xs))
*>* (define: min-y : Number (apply min ys))
*>* ...
*>* )
*>*
*>* All the calls to apply fail with
*>*
*>* typecheck: Bad arguments to function in apply:
*>* Domain: Number Number *
*>* Arguments: (Listof Number) *
*>*
*>* I don't get it! At the REPL I can do:
*>*
*>* (apply max (list 1 2 3 4))
*>*
*>* and it works. My expressions above seem equivalent. What must I do to
*>* get this past the type checker?
*>*
*>* N.
*>* _________________________________________________
*>* For list-related administrative tasks:
*>* http://list.cs.brown.edu/mailman/listinfo/plt-scheme
*