Racket - 编写谓词

Racket - Writing a predicate

所以我对 Racket 的介绍有点困惑。

我需要编写一个名为 "extend" 的函数,它接受一个元素和一个谓词,"extends" 谓词包含元素。例如:

    ((extend 1 even?) 1)
    #t
    ((extend 3 even?) 3)
    #f

我是这门语言的新手,但我不明白如何使用函数或 return 作为谓词。不知道是我想多了还是怎么的。

函数只是一个值,extend 只是一个像 +cons 一样的变量,其计算结果为函数值。函数可以作为参数传递,你只需使用你给它的任何名称,就像它是一个函数一样,通过使用括号,它就可以工作。

一个函数 return 是最后一个表达式的计算结果。要使其成为一个函数,它要么需要是一个计算为函数的变量,要么是一个也计算为函数的 lambda。

(define (double-up fn)
  (lambda (value)
    (fn (fn value)))) ; see. Just use fn as if it is a procedure

((double-up add1) 4) ; ==> 6
(define add2 (double-up add1))
(add2 4) ; ==> 6

(define error-use (double-up 5)) ; works like a charm
(error-use 4) 
; Signals "application: not a procedure" 
; since `5` isn't a procedure.

这是另一个与您的作业更相似的示例。它接受一个数字,然后 returns 一个接受另一个数字然后将它们相加的函数。这里我选择在本地定义它,然后把它作为最后一个表达式,这样它就成了结果。

(define (make-add initial-value)
  (define (adder new-value)
    (+ initial-value new-value))

  adder) ; this is the result

((make-add 5) 7) ; ==> 12

谓词就是我们所说的函数,通常在条件句中的谓词位置调用(如ifcond)。因此,只是一个 return #t#f 的函数,并且通常绑定到以问号结尾的变量作为命名约定。