Racket 无法降低和球拍功能

Racket 无法降低和球拍功能,racket,typed-racket,Racket,Typed Racket,我的教授给了我们这个功能: (: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean)) (define (every? pred lst) (or (null? lst) (and (pred (first lst)) (every? pred (rest lst))))) 我无法理解:All(A)(A->Boolean)的含义。 请有人给我解释一下-变量的含义是什么,函数得到了什么

我的教授给了我们这个功能:

(: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean))

(define (every? pred lst)
  (or (null? lst)
      (and (pred (first lst))
           (every? pred (rest lst)))))
我无法理解:
All(A)(A->Boolean)
的含义。
请有人给我解释一下-变量的含义是什么,函数得到了什么,它做了什么,它返回了什么,因为我无法理解它。

让我们在repl上旋转函数

> (every? even? (list 1 2 3 4))
#f

> (every? char? (list #\a #\b #\c))
#t
请注意,第一个列表
(列表1 2 3 4)
的类型是
(列表编号)
。 第二个列表
(list#\a#\b#\c)
的类型是
(Listof Char)

every?
lst
参数应该有什么类型? 显然,它需要一个列表,但元素是什么类型的? 我们不知道,所以我们把它做成一个
(a的列表)
,其中
a
代表 对于某些(未知)类型

但是,对列表中的元素调用谓词
pred
, 所以类型必须匹配。在第一个示例中:
偶数?
具有 “从数字到布尔值的函数”aka
(A->boolean)

通常,谓词需要类型:
(A->Boolean)

这就变成了:

  (: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean))

但是
pred
是什么意思呢?此函数声明在哪里?如果在程序中写入
(every?偶数?(列表1 2 3 4))
,则函数
every?
将使用两个参数调用。第一个参数是函数
偶数?
,另一个参数是列表
(1 2 3 4)
。由于
each?
被定义为
(define(each?pred lst)…)
因此在主体内部使用名称
pred
lst
,分别引用第一个和第二个参数。也就是说:没有声明
pred
函数。它是传递给
every?
的函数的名称。额外信息:名称
pred
是谓词的缩写。谓词是返回布尔值的函数。在Scheme和Racket中,谓词的名称通常以问号结尾。