什么是lambda

什么是lambda,lambda,functional-programming,lisp,scheme,Lambda,Functional Programming,Lisp,Scheme,我对这个计划很陌生。对每个人来说都是一个非常基本的问题。我在网上随处可见的函数调用中lambda是什么?它有什么作用?不使用lambda会有什么损失?lambda是Lisp编程语言家族中的一种特殊形式(在其他语言中对函数式编程有一定程度的支持),它是一个匿名函数,在定义它的上下文周围创建一个闭包 lambda在Lisp中随处可见,无论是显式的还是隐式的(在宏转换之后,隐式地在其他特殊形式中,等等),不使用它会损失什么?一切。对于初学者来说,定义过程的能力 要了解我所指的一些示例,请参见以下程序定

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

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))

说实话,几乎不可能不使用lambdas来用Lisp编写任何非平凡的程序。

Lambda是一个函数文字。打个比方可能会有帮助:

假设我想显示数字10。我可以用两种方法。首先,我可以将其放入变量中,然后显示变量,如下所示:

(define x 10)
(display x)
或者,我可以直接显示数字——一个数字文字——如下所示:

(display 10)
(display ((lambda (x y) (+ x y)) 10 20))
嗯,lambda是一样的。例如,如果我想显示应用两个数字相加的函数的结果,我可以将该函数放入一个变量中,并按如下方式显示结果:

(define f (lambda (x y) (+ x y)))
(display (f 10 20))
(for-each collection (lambda (element)
    ...))
或者我可以使用一个函数literal--lambda--如下所示:

(display 10)
(display ((lambda (x y) (+ x y)) 10 20))
另外,Scheme为您提供了定义函数的简捷方法,它可以隐藏lambda的真正本质。我还可以用以下公式定义f:

(define (f x y) (+ x y))
但我想把信件说清楚

lambda很有用,原因与数字文字很有用相同。在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)))
但如果我们假设这家公司是一次性的,那么我可能不想费心定义名称,因此我可以:

(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

然后我会这样使用它:

(define f (lambda (x y) (+ x y)))
(display (f 10 20))
(for-each collection (lambda (element)
    ...))
您还可以使用lambdas动态构建具有其他参数的函数;如果你想做一些手工的咖喱,这是一个大的回报。我将不深入讨论细节,因为我可能已经走得太远了,但我希望您能看到lambda在不引入太多复杂性的情况下为您提供了很多功能。这也应该回答你关于不使用它会损失什么的问题


函数文字(又称匿名函数)在函数式编程中是一件大事,它们在命令式语言中也在不断增长。掌握这项功能可以让你的生活变得更加轻松,并帮助你学习其他一些语言。

还有比这更清楚的吗@SpiffyDeveloper您正在隐式地使用lambda。请参阅我的更新答案。很抱歉,当我意识到您所说的内容时,我删除了我的旧评论。这是非常有用的,谢谢!