球拍 - 写一个谓词

时间:2016-09-06 22:04:11

标签: racket predicate

所以我对Racket的介绍感到有些困惑。

我需要编写一个名为" extend"的函数。这需要一个元素和一个谓词,并且"扩展"包含元素的谓词。例如:

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

我对这门语言比较陌生,但我不明白如何使用函数或作为谓词返回。不确定我是否过度思考它或者是什么。

1 个答案:

答案 0 :(得分:2)

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

函数返回最后一个表达式求值的值。为了使它成为一个函数,它需要是一个计算函数的变量或一个也计算函数的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.

这是另一个与你的作业更相似的例子。它需要一个数字,然后返回一个带有另一个数字然后将它们加在一起的函数。在这里,我选择在本地定义它,然后将其作为最后一次尝试,以便它成为结果。

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

  adder) ; this is the result

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

谓词是我们称之为条件中谓词位置的函数(如ifcond)。因此,只是一个返回#t#f并且经常绑定到以问号结尾的变量作为命名约定的函数。