Scheme 方案(DrRacket)用(&x2B;x 1)或lambda替换add1

Scheme 方案(DrRacket)用(&x2B;x 1)或lambda替换add1,scheme,racket,Scheme,Racket,我在这一页上做这个练习 在此代码中 (define (depth a-dl (cond [(symbol? a-dl) 0] [else (add1 (depth (first a-dl)))])) 我们使用add1预定义函数,这意味着(+x1),我想用(+x1)或lambda交换add1。可能吗?如果是,怎么做 但是我不想在函数之外写 (define (add1 x) (+ x 1)) 大概 (define add1 (lambda (x) (+ x 1)))

我在这一页上做这个练习

在此代码中

(define (depth a-dl
(cond
[(symbol? a-dl) 0]
[else (add1 (depth (first a-dl)))]))
我们使用add1预定义函数,这意味着(+x1),我想用(+x1)或lambda交换add1。可能吗?如果是,怎么做

但是我不想在函数之外写

(define (add1 x) 
        (+ x 1))
大概

(define add1 
(lambda (x)
    (+ x 1)))
add1
不能表示
(+x1)
,因为
add1
中没有
x

(add1 x)
可以表示
(+x1)
,如果这样定义的话

为了让它有这个意义,我们将它定义为

(define (add1 x)
        (+  1 x))
或相当于

(define  add1
     (lambda (x)
        (+  1 x)))
这意味着只要出现
add1
,就可以出现
(λ(x)(+1 x))
,效果相同

当然,写作

( (lambda (x) (+ 1 x)) ....Y.... )
和写作一样

(              + 1     ....Y.... )

您始终可以将一个函数替换为执行相同操作的另一个函数,或者将整个调用替换为执行相同操作的表达式。你怎么说是什么意思?我的意思是,对于这个代码段(add1(depth(first a-dl))
我不能使用((+a-dl 1)(depth(first a-dl))
不,你要么用
(lambda(x)(+x1))(depth…)替换
(add1(depth…)
,要么替换整个调用
(+(depth…)1)
。这些都是您的编解码器的真正重构。我们可以将这个lambda函数与我上面的函数“depth”集成在一起。大致如此(定义深度a-dl(lambda……
,只要您想写
(add1…)
就放
(lambda(x)(+1 x))
而不是那段代码中的
add1
。删除AD1中的4个字符,换成另一个。我不理解lambda,但要用+1替换add1很容易,所以我写了[else(+(depth(first a-dl))1])正确!这也会起作用。这两种方法是等效的。使用简单的
lambda
定义很容易看到,使用更复杂的代码则更复杂。这个过程被称为beta reduce。你可以在维基百科或其他网站上查找。