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).请有人可以向我解释 - 变量的含义是什么,函数得到了什么,它做了什么以及回归是什么,因为我无法弄明白.
让我们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)