# [plt-scheme] Re: Re: Typed Scheme

So what are the semantics of case-lambda: when there are multiple cases
with one argument? It looks like polymorphism is handled using
runtime checks on union types. This flexible, but since I have to add the
type annotations anyway, it would be be nice if case-lambda: could handle
it:
(define-typed-struct leaf ([val : number]))
(define-typed-struct node ([left : (U node leaf)] [right : (U node leaf)]))
;;maybe (define: tree-height : ((U node leaf) -> number)
(define: tree-height : (case-lambda (node -> number) (leaf ->
number))
(case-lambda:
(((t : leaf)) 1)
(((t : node))
(max (tree-height (node-left t))
(tree-height (node-right t))))))
Matt
On Sun, 27 May 2007 00:35:37 -0400, Sam TH wrote:
>* Matthew-
*>*
*>* Unfortunately not. If you have a suggestion for a more compact
*>* syntax, I'd be happy to consider it.
*>*
*>* Also, note that your function always calls the first case, because
*>* that's how the underlying case-lambda form works. The fact that your
*>* code typechecks is actually a bug in the typechecker - that function
*>* has type (Number -> Number). The next release of the package will fix
*>* this (among other) bug.
*>*
*>* sam th
*>*
*>* On 5/27/07, Matthew Swank <akopa.gmane.poster at gmail.com> wrote:
*>>*
*>>* This is a silly example:
*>>*
*>>* (define: x-or-nil : (case-lambda (number -> number)
*>>* ((Listof number) -> (Listof number)))
*>>* (case-lambda:
*>>* (((x : number)) x)
*>>* (((x : (Listof number))) ())))
*>>*
*>>* but is there a more compact way to define case-lambdas?
*>>*
*
--
"You do not really understand something unless you can
explain it to your grandmother." - Albert Einstein.