使用
(define (double fn) (lambda (x) (fn (fn x))))
你能解释一下怎么做吗
((((double double) double) 1+) 0)
等于16??它是如何使用替换的?
该double
函数接受另一个函数(让我们称之为 function fn
)作为它的参数,然后返回一个接受一个任意参数的函数。它将参数传递给fn
,然后将结果传递给,fn
这就是结果。
例如:
> ((double add1) 1)
3
它调用add1
1,返回 2,然后调用add1
2,得到结果 3。
在您的示例中,我们将 double 传递给自身,因此现在我们有一个过程,当给定 your 时1+
,它将向我们给它的任何内容添加 4(因为我们有两个double
's,并且每个都double
调用两个1+
's)。但是随后我们将我们的新过程传递给另一个 double
,这样我们就有了八个(我们已经创建double
的所有四个都将调用两个)。double
这八个电话中的每一个都调用1+
了两次。
所以这个新过程将调用1+
两次,八次,你给它的任何参数,因此将16添加到你传递给它的任何参数。
它是如何使用替换的?
如果您使用的是 Racket,您可以使用 DrRacket 的 Stepper Tool 在“Intermediate Student with lambda”语言中查看确切的替换步骤。