为什么我们在scheme中使用嵌套的lambdas?

时间:2016-11-06 10:36:05

标签: lambda scheme racket

我的作业中有几行代码:

(define square-a-procedure
(lambda (f) (lambda (x) (square (f x)))))

我不明白为什么我不能把它写成

(define square-a-procedure (lambda (f x) (square (f x))))

我知道这是关于类型的,但我真的不明白为什么我们一个接一个地拿参数而不是一次性拿走所有参数。

2 个答案:

答案 0 :(得分:1)

两个版本通过产生相同的结果来工作,但是一个版本返回一个可以在高阶函数中使用的部分应用程序。想象一下,您想要在列表中添加常量和方形元素。我们可以轻松地使用您的第一个版本:

(define (add4 n)
  (+ n 4))

(map add-4-and-square 
     (square-a-procedure add4) 
     '(0 1 2 3))                ; ==> (16 25 36 49)

除非我们将它包裹在一个实际与第一个完全相同的lambda中,否则我们无法做到这一点。我们经常不假思索地进行部分应用:

(map (lambda (n) (+ n 4)) '(1 2 3)) ; ==> (5 6 7)

答案 1 :(得分:0)

如果我们同时采用两个参数,我们将被迫在同一时间点取两个参数。因此,我们函数的用户必须同时指定两个参数。

如果我们一次采用一个参数,我们可以在两个不同的时间点获取它们。因此,我们函数的用户可以单独指定函数的每个参数。这更灵活。由于Scheme具有词法范围,因此从外部调用返回的内部lambda“记住”其创建中使用的参数。这就是闭包,这使得我们的代码中的对象的建模成为可能。