不能低于球拍功能

shu*_*ein 2 racket typed-racket

我的proffesor给了我们这个功能:

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

(define (every? pred lst)
  (or (null? lst)
      (and (pred (first lst))
           (every? pred (rest lst)))))
Run Code Online (Sandbox Code Playgroud)

我无法理解的含义:All (A) (A -> Boolean).请有人可以向我解释 - 变量的含义是什么,函数得到了什么,它做了什么以及回归是什么,因为我无法弄明白.

soe*_*ard 5

让我们every?在repl 上给函数一个旋转:

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

> (every? char? (list #\a #\b #\c))
#t
Run Code Online (Sandbox Code Playgroud)

请注意,第一个列表的类型(list 1 2 3 4)(Listof Number).第二个列表的类型(list #\a #\b #\c)(Listof Char).

这个lst论点应该every?有什么类型?显然它需要是一个列表,但元素是什么类型的?我们不知道,所以我们把它变成了一个(Listof A),A代表某种(未知)类型.

但是,谓词pred是在列表中的元素上调用的,因此类型必须匹配.在第一个例子中:even?具有"从数字到布尔的函数"的类型(A -> Boolean).

通常我们需要类型:(A -> Boolean)用于谓词.

这变为:

  (: every? : (All (A) (A -> Boolean) (Listof A) -> Boolean))
Run Code Online (Sandbox Code Playgroud)