# [plt-scheme] typed-scheme: conditional branches and parametric polymorphism

2010/1/28 Jon Zeppieri <zeppieri at gmail.com>:
>* For this particular function, it's easy just to handle the Fail case
*>* of Parser-Result first, and handle the Ok case in the else clause:
*>*
*>* (: || (All (A T) ((Parser A T) (Parser A T) -> (Parser A T))))
*>* (define (|| p1 p2)
*>* (λ (tks ncur nmax)
*>* (let ((r1 (p1 tks ncur nmax)))
*>* (cond ((Fail? r1) (p2 tks ncur nmax))
*>* (else r1)))))
*>*
*
Anyhow, I decided to give the alternative combinator variable arity,
so its type is now:
(All (A T) ((Parser A T) * -> (Parser A T)))
... and the problem doesn't arise in the new function.
But, I have a new question. I'm trying to type an analogous variable
arity sequence combinator. The binary case would have the type:
(All (A B T) ((Parser A T) (Parser B T) -> (Parser (List A B) T)))
Can the vararg case be typed? Following the example given for map in
the guide, I tried:
(All (T A ...) ((Parser A T) ... A -> (Parser (List A ... A) T)))
... but I get the error:
typecheck: Type variable A must be used with ... in: A
The first 'A' in the return type is highlighted.
-Jon