Как дать конкретный тип функции в качестве параметра в Racket / Plait? - PullRequest
0 голосов
/ 25 января 2019

Я пишу функцию, которая принимает функцию и список в качестве параметров. Функция параметра и список должны иметь значения одного типа. Как я могу это гарантировать?

Я пробовал:

(define ( (func -> 'a) [lst : (Typeof 'a)])
     ....)

Однако я не смог заставить его работать. Я также прошел учебник по косичкам, но не нашел ничего подходящего.

Возможно ли даже иметь функцию, которая принимает функцию определенного возвращаемого типа?

1 Ответ

0 голосов
/ 25 января 2019

Это то, что вы ищете?

(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"))
...