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。你可以在维基百科或其他网站上查找。