Это то, что вы ищете?
(define f : (('a -> 'a) (listof 'a) -> string)
(lambda (func lst) "hello"))
Тогда:
(f (lambda ([x : number]) x) (list 1))
проверки типа, но:
(f (lambda ([x : number]) x) (list "foo"))
проверки типа непотому что 'a
унифицируется со строкой (из "foo"
), но также унифицируется с числом (из x
), поэтому происходит несовпадение типов.
Обратите внимание, что
(define f : (('a -> 'a) (listof 'a) -> string)
(lambda (func lst) "hello"))
и
(define (f [func : ('a -> 'a)] [lst : (listof 'a)]) : string
"hello")
различны.В первом случае 'a
относится к одной и той же переменной типа в аргументах.В последнем случае func
'a
и lst
'a
различны.Поэтому в последнем случае проверяется следующий тип выражения:
(f (lambda ([x : number]) x) (list "foo"))