【问题标题】:What is lambda in scheme [closed]什么是方案中的 lambda [关闭]
【发布时间】:2012-12-29 00:55:07
【问题描述】:

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

【问题讨论】:

标签: lambda functional-programming lisp scheme


【解决方案1】:

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 中编写任何重要的程序。

【讨论】:

  • @SpiffyDeveloper 您隐含地使用了 lambda。请参阅我的更新答案。
  • 对不起,当我意识到你的意思时,我删除了我的旧评论。这非常有帮助,谢谢!
【解决方案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))

但我想把通信弄清楚。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多