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中,谓词的名称通常以问号结尾。