2

我对计划很陌生。对每个人来说都是非常基本的问题。我在网上随处可见的函数调用中的 lambda 是什么?它有什么作用?不使用它会失去什么?

4

2 回答 2

3

lambda是 Lisp 编程语言家族中的一种特殊形式(以及在一定程度上支持函数式编程的其他语言),它是一个匿名函数,它围绕定义它的上下文创建一个闭包。

Lambda 在 Lisp 中随处可见,无论是显式的还是隐式的(在宏转换之后,隐式地以其他特殊形式等)。不使用它会失去什么?一切。对于初学者来说,定义程序的能力!

要查看我的意思的一些示例,此过程定义:

(define (f x)
  x)

... 只是为此的语法糖,一个命名过程,它只是将名称与匿名相关联lambda

(define f
  (lambda (x)
    x))

同样,let将值绑定到变量的形式:

(let ((x 9))
  (+ x 1))

... 只是语法糖:

((lambda (x)
   (+ x 1))
 9)

当然,可以使用 lambdas 作为定义匿名函数的快捷方式:

(map (lambda (x) (* x x))
     '(1 2 3 4 5))

说实话,几乎不可能使用 lambda 在 Lisp 中编写任何重要的程序。

于 2013-01-15T00:13:16.663 回答
3

Lambda 是一个函数式文字。一个类比可能会有所帮助:

假设我想显示数字 10。我可以通过两种方式实现。首先,我可以将它放在一个变量中,然后显示该变量,如下所示:

(define x 10)
(display x)

或者,我可以直接显示数字——一个数字文字——像这样:

(display 10)

一个 lambda 也是一样的。例如,如果我想显示应用一个将两个数字相加的函数的结果,我可以将该函数放在一个变量中并像这样显示结果:

(define f (lambda (x y) (+ x y)))
(display (f 10 20))

或者我可以只使用一个函数文字——lambda——就像这样:

(display ((lambda (x y) (+ x y)) 10 20))

顺便说一句,Scheme 为您提供了定义函数的简写,它可以隐藏 lambda 的真实性质。我也可以定义 f :

(define (f x y) (+ x y))

但我想让通信清楚。

Lambda 之所以有用,与数字文字有用的原因相同。在 Scheme 中,您可以拥有将其他函数作为参数的函数。好吧,有时您想使用其中一个具有“一次性”功能的功能,因此不想费心给它起个名字。例如,让我们看一下 map,它将函数应用于列表:

(map f my-list) 

生成一个新列表,其结果为 f 应用于每个元素。那么如果我想增加列表的每个元素呢?我可以做:

(define inc (lambda (x) (+ x 1)))
(display (map inc '(1 2 3)))

但是,如果我们假装这个公司是一次性的,那么我可能不想费心定义名称,因此我可以这样做:

(display (map (lambda (x) (+ x 1)) '(1 2 3)))

lambda 另一个有用的地方是,如果您想创建类似控制结构的东西,但又不想使用宏。好吧,我可以用 lambda 包装我想要做的事情,并且由于它继承了它所在的上下文,所以它工作得很好。例如,假设我需要编写自己的“for-each”版本。这是大纲:

(define for-each (lambda (collection body) 
     ...))

其中 body 是表示“控制结构”主体的 lambda。

然后我会这样使用它:

(for-each collection (lambda (element)
    ...))

您还可以使用 lambdas 动态构建带有其他参数的函数;如果你想做一些手动柯里化,这会带来很大的好处。我不会详细介绍,因为我可能已经走得太远了,但我希望您能看到 lambda 为您提供了很多功能,而不会引入太多复杂性。这也应该回答您关于不使用它会失去什么的问题。

函数字面量(又名匿名函数)在函数式编程中很重要,而且它们也在命令式语言中不断发展。掌握此功能可以让您的生活更轻松,并帮助您学习其他一些语言。

于 2013-01-15T00:28:45.183 回答