什么是Lambda语言?

92

我在阅读《JavaScript权威指南》时,作者提到JavaScript是第一种推出的λ语言。

JavaScript的函数是一等公民,拥有(大部分)词法作用域。JavaScript是第一种主流的λ语言。从深层次上讲,JavaScript与Lisp和Scheme比与Java更相似。它是穿着C外衣的Lisp。这使得JavaScript成为了一种非常强大的语言。

我不明白什么是λ语言。这种语言的特性是什么,它与Java、C、C++和PHP等语言有何不同之处?


6
Lambda 表示匿名表达式。所以 Lambda 语言 -> 具有匿名表达式的语言。 - bevacqua
3
请参阅维基百科上的 lambda演算 - Oded
许多很好的回复。到目前为止,我所理解的是,如果您使用匿名函数,则正在使用 Lambda 语言。这是否是正确的理解?Lambda 语言与 Java 等语言有何不同? - sushil bharwani
4
我正在阅读《JavaScript: The Good Parts》,作者提到JavaScript是首个推出的lambda语言。于是我在谷歌上搜索了lambda语言,发现了Stack Overflow上的这个问题 :) - Bugs Bunny
7个回答

49

简单来说,一个 λ(lambda)语言是允许将函数作为参数传递给另一个函数,并且这个函数与其他变量一样处理的语言。此外,您应该能够定义这个要传递的函数为匿名的(或内联的)。PHP 5.3 添加了对 lambda 函数的支持。JavaScript 是第一个主流语言吗?在 JavaScript 之前,Lisp 在教育环境中被广泛使用,并用于自定义我们所钟爱的 Emacs http://www.gnu.org/software/emacs/manual/html_node/eintr/

下面是一个例子:

function applyOperation(a, b, operation) {
  return operation(a,b);
}

function add(a,b) { return a+ b; }
function subtract(a,b) {return a - b;}

// Can be called like
applyOperation(1,2, add);
applyOperation(4,5, subtract);
// Anonymous inline function
applyOperation(4,7, function(a,b) {return a * b})

Java和C有何不同?在C中,您可以传递指向函数的指针,但无法匿名内联定义它。

在Java中(版本8之前),为了实现相同的效果,您必须传递实现接口的对象,该接口实际上可以匿名内联定义。


1
"Lisp已被广泛使用",由谁使用?我一直知道它,因为教授们总是讨论它,但在实践中,我从未遇到过任何使用Lisp的人。我会说,任何人都可以找到一个使用Javascript的人,这使得Javascript更加“主流”。 - palswim
"PHP 5增加了对lambda函数的支持。实际上,是PHP 5.3引入了lambda函数。" - Crozin
我遇到了一些在商业环境中使用它的人,但就像Pascal曾经一样,它在教育领域被广泛使用。 - Ruan Mendes

40
我从未听过任何人使用“lambda语言”这个术语,我能想到的唯一可行的定义将排除JavaScript作为“第一个”。
话虽如此,我怀疑他可能指的是以下两种情况之一:
1. 函数式语言: 一类语言,其中计算可以建模为(或可以建模为)无状态组合的(可能是高阶的)函数。 LISP、Scheme、ML、Haskell 等常被归类为这一类,尽管其中几个更恰当地属于混合范式或“函数可选”语言。JavaScript可以说包含了使“函数式编程风格”成为可能的必要功能。
2. 允许创建匿名函数的语言 (在 JavaScript 中使用 `function` 语法; 这在许多语言中被写作 `lambda`),因此可能是“lambda语言”。
这两种用法都源自于希腊字母lambda用于表示lambda演算中的函数抽象,lambda演算是由Alonzo Church设计的计算模型,并基于此进行函数式编程。
编辑:查看Google图书结果---“第一个进入主流”; 嗯,这是有争议的。 我认为LISP曾经至少相当流行。 不过这是个公平的观点,JavaScript的语义直接受到Scheme的启发,并且它肯定达到了比其他可以提出类似要求的语言更大的受众。

5
JavaScript被描述为“第一”是因为这个说法带有“成为主流”的限定条件。我认为很明显,JavaScript确实是第一个被日常程序员在日常工作中使用的函数式语言。 - rfunduk
1
当你说编程语言的“函数式”时,你是什么意思?我来自Java背景,正在尝试学习JavaScript,它有什么不同之处? - sushil bharwani
9
这是一个很大的主题需要探索。去年我和现在的你一样:我发现了 Crockford 的文章和讲座,想要理解闭包。我建议你先从维基百科开始,然后再阅读一些文章:John Hughes 的 “Why Functional Programming Matters” http://www.scribd.com/doc/26902/whyfp,Slava Akhmechet 的“Functional Programming for the rest of us” http://www.defmacro.org/ramblings/fp.html。有很多书可以拓宽你的视野:看看 Little Schemer 以了解 Scheme 的感觉,然后再转到《计算机程序的构造和解释》。 - okonomichiyaki
当然,SO上也有很多关于闭包、lambda表达式等的问题,并且有很好的解释... - okonomichiyaki
5
@sushil:关于这个主题有很多入门文献。但总的来说,它是一种强调将程序视为数学对象而不是顺序指令或抽象对象之间交互的编程风格。例如,函数式语言更喜欢使用递归而不是迭代,利用不可变数据结构,并优先使用高阶函数而不是“函数对象”或“策略模式”。高阶函数意味着可以操作其他函数(作为参数)或产生其他函数(作为返回值)的函数。 - Derrick Turk
显示剩余3条评论

4

我曾经看到过lambda被定义为匿名函数和对函数的引用。Javascript支持这两种方式:

setTimeout(function(){ /* an anonymous function */ }, 100)

var f = function(){ /* function ref */ }

这就是JS获得其强大和灵活性的地方。Java在某种程度上支持第一个(匿名接口实现),但不支持后者-有关Java 8的更新请参见下文。
我不清楚这两者中的哪一个(或两个)是lambda的正确定义。
JS绝对不是第一种支持这些功能的语言。记忆中,我认为Smalltalk是语言爱好者总是热衷于支持lambda的语言之一。
顺便说一句:在Java中,匿名类通常用于即时传递类定义作为参数(在swing中经常使用)。类似这样(从记忆中,未编译):
someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

更新

Java自8版本起,现已正式成为Lambda语言。

现在您可以使用以下语法:

MathOperation addition = (int a, int b) -> a + b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));

Code Source


4

他提到了Lambda演算

Lambda演算(也写作λ-演算)是一种用于函数定义、函数应用和递归的形式系统。[...]

[...] 未打类型的Lambda演算是函数式编程的最初灵感来源,特别是Lisp,而带类型的Lambda演算则成为现代类型系统的基础。


1
在MIT的开放课程结构和计算机程序设计的解构中,Hal Abelson,Jerry Sussman和Julie Sussman所写的一本书中,他们讨论了Scheme这个LISP方言,并对lambda是什么以及Scheme LISP和语言总体进行了非常详细和清晰的解释。如果你想要真正清晰而深入地理解计算机编程,我强烈建议你去看看这本书或观看教程视频,它们完美地解释了其中的内容,太棒了!
JavaScript主要基于Scheme语言及其Lisp之父,并采用其lamda结构并成为主流。

0

来自维基百科: 在Lisp和Python等编程语言中,lambda是一个运算符,用于表示匿名函数或闭包,遵循λ演算的用法。在Python语言中使用lambda的一个例子是下面这段计算机代码,它通过每个条目的最后一个字符按字母顺序对列表进行排序:

>>> list = ['woman', 'man', 'horse', 'boat', 'plane', 'dog']
>>> sorted(list, key=lambda word: word[-1])
['horse', 'plane', 'dog', 'woman', 'man', 'boat']

* In the C# programming language a lambda expression is an anonymous function that can contain expressions and statements

0
  • JavaScript 允许定义匿名函数,即不绑定到标识符的函数。这种函数也称为 Lambda 抽象,由于 JS 支持此功能,因此它被称为 Lambda 语言。

  • 属性:在需要立即执行函数或短期使用函数的情况下,需要此函数,其中没有给函数命名的重要性。

  • 与 Java、C、C++ 和 PHP 等语言不同,在 JS 中,匿名函数用于闭包和柯里化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接