什么是lambda语言?

时间:2010-10-05 15:45:21

标签: javascript lambda

我正在阅读“JavaScript:The Good Parts”,作者提到JavaScript是第一个推出的lambda语言。

  

JavaScript的函数是具有(主要)词法范围的第一类对象。 JavaScript是第一个成为主流的 lambda语言。在内心深处,JavaScript与Lisp和Scheme有更多共同点,而不是Java。这是C的服装中的Lisp。这使得JavaScript成为非常强大的语言。

我没有得到什么是lambda语言。这种语言有哪些属性,它与Java,C,C ++和Php等语言有何不同?

7 个答案:

答案 0 :(得分:47)

简单来说,lambda语言是一种允许将函数传递给另一个函数的语言,其中函数被视为任何其他变量。此外,您应该能够定义此函数以匿名(或内联)方式传递。 PHP 5.3增加了对lambda函数的支持。 JavaScript是第一个主流语言吗? Lisp在JavaScript之前已广泛用于教育环境,也用于定制我们心爱的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})

它与C有什么不同?在C中,您可以将指针传递给函数,但不能匿名内联。

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

答案 1 :(得分:36)

我从来没有听过任何人使用“lambda语言”这个词,而我能想到的唯一合理的定义会将JavaScript排除在“第一个”之外。

那就是说,我怀疑他的意思是:

  • 功能语言:一类语言,其中计算(或可以)被建模为(可能是更高阶)函数的无状态组合。 LISP,Scheme,ML,Haskell等经常归于这一类,尽管其中一些是更恰当的混合范式或“功能可选”语言。 Javascript可以说包含了使编程的“功能样式”成为可能的必要功能。
  • 允许创建匿名函数的语言(在JavaScript中使用function语法;这是用许多语言编写的lambda,因此可能是“lambda语言”。

这两种用法都源于使用希腊字母lambda来表示lambda演算中的函数抽象,这是由Alonzo Church设计的计算模型以及函数式编程所依据的。

编辑:看了谷歌图书的结果---“率先走向主流”;好吧,那是有争议的。我提出LISP至少在某种程度上是合理的主流。这是一个公平的观点,JavaScript的语义直接受到Scheme的启发,它肯定比其他任何可以提出类似声明的语言都能吸引更多的观众。

答案 2 :(得分:4)

他指的是Lambda calculus

  

Lambda演算,也写为λ演算,是函数定义,函数应用和递归的形式系统。   [...]

     

[...]无类型的lambda演算是函数式编程的最初灵感,特别是Lisp,以及作为现代类型系统基础的类型化lambda演算。

答案 3 :(得分:4)

我已经看到lambda被定义为匿名函数和函数的引用。 Javascript支持两者:

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

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

这是JS获得大量功能和灵活性的地方。 Java在某种程度上支持(匿名接口实现),但不支持后者 - 请参阅下面的Java 8更新。

我不清楚这些中哪一个(或两者)是lambda的正确定义。

JS绝对不是第一种支持这些功能的语言。从记忆中走出来,我认为语言爱好者总是对支持lambdas赞不绝口。

BTW:在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 :(得分:1)

麻省理工学院的开放式课程称为计算机程序的结构和解释,是哈尔阿贝尔森的书,杰里苏斯曼和朱莉苏斯曼的书。他们讨论了Scheme,这是LISP的一种方言,在那里他们解释了lambda是什么以及Scheme LISP和语言的非常详细和清晰的解释。如果您希望对计算机编程有一个非常清晰和深刻的理解,我强烈建议您查看它。向你解释你需要花费三倍的时间,就像你去那里,只是阅读书籍或观看完美解释它的教程,这是天才。

Javascript主要基于语言Scheme和它的Lisp父亲,此外它采用了lamda结构并成为主流。

答案 5 :(得分:0)

来自维基百科: 在Lisp和Python等编程语言中,lambda是一个运算符,用于表示使用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

答案 6 :(得分:0)

  • JavaScript允许定义匿名函数,该函数是未绑定到标识符的函数。这种功能也称为Lambda Abstraction,由于JS支持这种功能,因此称为Lambda语言。

  • 属性:在立即执行函数或短期使用时需要此函数,其中没有赋予函数名称的重要性。

  • 它与Java,C,C ++和PHP等语言不同,如JS中的匿名函数用于Closure和Currying。