我非常擅长计划。每个人都非常基本的问题。什么是函数调用中的lambda我在网上到处看到了什么?它有什么作用?不使用它会让我失去什么?
答案 0 :(得分:2)
lambda
是Lisp编程语言系列中的一种特殊形式(在其他语言中对函数式编程有一定程度的支持),它是一个匿名函数,它在定义它的上下文周围创建一个闭包
Lambdas在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))
说实话,不几乎不可能使用lambdas在Lisp中编写任何非平凡的程序。
答案 1 :(得分:2)
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))
但我想明确通信。
Lambdas对数字文字有用的原因很有用。在Scheme中,您可以使用其他函数作为参数的函数。好吧,有时你想使用其中一个具有“一次性”功能,因此不想打扰给它一个名字。例如,让我们看一下map,它将一个函数应用于列表:
(map f my-list)
生成一个新列表,其结果将应用于每个元素。那么如果我想增加列表中的每个元素呢?我能做到:
(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给你很多力量而不会引入太多复杂性。这也应该通过不使用它来回答你关于你输了什么的问题。
函数文字(又名匿名函数)在函数式编程中是一个大问题,它们也在命令式语言中不断发展。掌握这一功能可以让您的生活更轻松,并帮助您学习其他一些语言。