Greetings, all.

I'm terribly puzzled by a typed-racket error message I'm getting (I seem to be 
rather abusing this list today -- apologies -- but I'm busy reminding myself 
why it's useful not to do two interesting develoments with a project at one 
time).

If I run the following in DrRacket:

#lang typed/racket

(: my-func (String String -> String))
(define (my-func s1 s2)
  (string-append s1 ":" s2))

(my-func "Hello" "World")

(: call-func ((List String String) -> String))
(define (call-func string-list)
  ((inst apply String String) my-func string-list)
  ;(apply my-func string-list)
  )

(call-func '("Hello" "There"))

...I get an error message

> Type Checker: Cannot instantiate non-polymorphic type ((String * -> String) 
> (Listof String) -> String) in: apply

Dr Racket also tells me that:

    > apply
    - : (All (a b) ((a * -> b) (Listof a) -> b))

Which makes sense, in that it corresponds to the message I'm seeing.

Now, I don't _really_ follow the logic of Typed Racket in a fully formal way (I 
know, I should have another go at The Little MLer), but the only way I can 
really make sense of this message is if the type (String String -> String) is 
not a subtype of (String * -> String), or if (List String String) is not a 
subtype of (Listof String).  Both of these would be a little unexpected.

Is that the right interpretation (in which case, where could I find the 
hierarchy of types?); or is APPLY being more particular about its types than is 
appropriate?

Thanks for any pointers.

Best wishes,

Norman


-- 
Norman Gray  :  http://nxg.me.uk
School of Physics and Astronomy, University of Glasgow, UK


_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

Reply via email to