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