我对计划很陌生。对每个人来说都是非常基本的问题。我在网上随处可见的函数调用中的 lambda 是什么?它有什么作用?不使用它会失去什么?
2 回答
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 中编写任何重要的程序。
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 为您提供了很多功能,而不会引入太多复杂性。这也应该回答您关于不使用它会失去什么的问题。
函数字面量(又名匿名函数)在函数式编程中很重要,而且它们也在命令式语言中不断发展。掌握此功能可以让您的生活更轻松,并帮助您学习其他一些语言。