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
谓词就是我们所说的函数,通常在条件句中的谓词位置调用(如if
和cond
)。因此,只是一个 return #t
或 #f
的函数,并且通常绑定到以问号结尾的变量作为命名约定。
所以我对 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
谓词就是我们所说的函数,通常在条件句中的谓词位置调用(如if
和cond
)。因此,只是一个 return #t
或 #f
的函数,并且通常绑定到以问号结尾的变量作为命名约定。