The problem is not the `AnyValues` since it accepts all types, but you cannot instantiate a polymorphic type to return multiple values, so you have to return (cons ... ...) in dynamic-wind then extract that pair as two return values of the function.
On Sun, Mar 5, 2017 at 3:23 PM, kay <[email protected]> wrote: > I have the following simple module that I'm converting to typed/racket. I > got a type check error that I don't know how to fix. More specifically, > it's related to the polymorphic function dynamic-wind's arguments. I read > from document [1] that type inference doesn't work for a lambda that is an > argument to a polymorphic function. But since here the three arguments are > all thunks (without input argument), I don't know how to properly annotate > them. > > Note that I tried to even annotate the first argument: > > (λ () (ann #f AnyValues)) > > And the type checker complained: > > Argument 1: > Expected: (-> AnyValues) > Given: (-> AnyValues) > > which is really weird. > > > [1]: https://docs.racket-lang.org/ts-guide/more.html#%28part._ > when-annotations~3f%29 > > > > Here's the module: > ------------------ > > #lang typed/racket > > ;;(require racket/string racket/list racket/match racket/system > racket/port racket/function) > (provide execute) > > (: execute (-> String * (Values String String))) > (define (execute . args) > (define cmdln (string-join args)) > (displayln (format "running ~a" cmdln)) > (match (process cmdln) > [(list out in pid err f) > > (define cust (make-custodian)) > (dynamic-wind > (λ () (ann #f AnyValues)) > > (thunk > (parameterize ([current-custodian cust]) > (define buf_stdout (open-output-string)) > (define buf_stderr (open-output-string)) > > (thread (λ () (copy-port out buf_stdout (current-output-port)))) > (thread (λ () (copy-port err buf_stderr (current-error-port)))) > > (displayln (f 'status)) > (f 'wait) > > (values (get-output-string buf_stdout) (get-output-string > buf_stderr)))) > > (thunk (custodian-shutdown-all cust))) > ])) > > > > > Here's the type error: > ---------------------- > > . executor.rkt:14:5: Type Checker: Polymorphic function `dynamic-wind' > could not be applied to arguments: > Argument 1: > Expected: (-> AnyValues) > Given: (-> AnyValues) > Argument 2: > Expected: (-> a) > Given: (-> (values (String : (Top | Bot)) (String : (Top | Bot)))) > Argument 3: > Expected: (-> AnyValues) > Given: (-> Void) > > Result type: a > Expected result: (values String String) > in: (dynamic-wind (λ () (ann #f AnyValues)) (thunk (parameterize > ((current-custodian cust)) (define buf_stdout (open-output-string)) (define > buf_stderr (open-output-string)) (thread (λ () (copy-port out buf_stdout > (current-output-port)))) (thread (λ () (copy-port err buf_stderr > (current-error-port)))) (displayln (f (quote status))) (f (quote wait)) > (values (get-output-string buf_stdout) (get-output-string buf_stderr)))) > (thunk (custodian-shutdown-all cust))) > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

