匿名lambda函数(函数式编程)


10

什么是匿名(lambda)函数?功能编程语言中匿名函数的正式定义是什么?

简单来说,当我在scheme / lisp中编程时,我会说匿名(lambda)函数是未绑定到标识符的函数。

关于lambda函数,您能说的就是这些吗?我认为可以将更多细节添加到此简单定义中。请详细说明,谢谢!


Answers:


10

我认为,这就是您真正可以说的。

这个想法是,在高级语言中,函数只是另一种价值。与在C中具有(3 + 4)没有标识符的方式相同,在scheme中可以具有(lambda(x)+(3 x)))没有标识符。

这里的关键不是匿名函数有什么特别之处。只是其他语言的限制要求将功能与任何其他值区别对待。特殊定义适用于不允许使用的过程语言,不适用于允许使用的功能性语言。


11

在lambda演算中,所有函数(术语)都是匿名的。这是lambda演算的一项基本属性:您可以从较简单的函数组成复杂的函数,而无需给它们命名。

在编程语言中,在大多数情况下都希望为函数命名,因为这是我们的思维方式,并且使代码对人类可读。但是编译最终会在生成可执行文件时删除名称(如果我们忽略调试信息)。

如果一种语言允许表达匿名函数(即没有名称的函数),则可以为程序员和编译器带来好处:程序员通常可以编写较短的代码,并且编译器可以更好地进行优化,因为知道仅在给定的情况下使用了匿名函数。的地方,而不是其他任何地方。


1

这取决于您将重点放在问题的哪一部分。如果专门针对匿名函数匿名,那么实际上唯一的答案就是它们是未绑定。如果泛泛地谈论函数,那么对于应用语言,匿名函数可能是在函数设置中使用lambda演算的最明显体现。

实际上,从lambda演算的角度来看,lambda表达式是用于创建绑定的非常语法化的构造。回忆一下lambda微积分中使用的表示法:

λFλXFX

FXFX

语言通常提供诸如let(ML之类的语言,方案)或define(方案)之类的方式来创建可在顶层使用的绑定(或在比函数更复杂的语法构造中使用的绑定,例如模块或对象),但这是唯一需要的工具绑定是较低级别的lambda。

如果您查看诸如Scheme或Lisp方言之类的语言,它们的根本就是lambda演算,而许多特殊形式的确是糖衣的lambda。

对于连接语言,情况略有不同。Lambda不是必需的,实际上适得其反。当所有内容都是函数时,定义匿名lambda有什么意义?

这两种方式之间存在某种双重性。后者侧重于无点函数组合,因此尝试将所有内容表示为函数,而前者则处理更复杂的演算,并努力像其他语言值一样将函数作为第一类值。在这方面,人们可以看到lambdas是这一努力的结果。

在此答案中引入了一些关于该主题的指针(效果很差):

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.