什么是Lambda语言?


89

我在阅读“ JavaScript:好的部分”,作者提到JavaScript是要发布的第一种lambda语言。

JavaScript的函数是具有(主要是)词法作用域的一流对象。JavaScript是第一种成为主流的Lambda语言。内心深处,与Lisp和Scheme相比,JavaScript与Java有更多的共同点。是C的衣服上的Lisp。这使得JavaScript是非常强大的语言。

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


6
Lambda表示匿名表达。因此,lambda语言->具有匿名表达式的语言
bevacqua 2010年

Google图书链接,仅供参考:books.google.co.uk/…–
卢卡斯·琼斯

3
请参阅Wikipedia上的Lambda演算
Oded 2010年

很多好的答复。我到目前为止所了解的是,如果您使用的是匿名函数,那么您正在使用lambda语言。是正确理解lamda语言与Java之类的语言有何不同。
sushil bharwani 2010年

4
“我正在阅读'JavaScript:The Good Parts',作者提到JavaScript是将要发布的第一种lambda语言。” 因此,我搜索了lambda语言,并在SO上找到了这个问题:)
Bugs Bunny 2014年

Answers:


38

我从未听说过有人使用“ lambda语言”一词,而且我能想到的唯一似乎合理的定义将J​​avaScript排除为“第一个”。

话虽如此,我怀疑他可能意味着:

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

两种用法均源自希腊字母lambda的使用,以表示lambda微积分中的函数抽象,由Alonzo Church设计的计算模型以及函数式编程所基于。

编辑:看过Google图书的结果---“率先成为主流”;好吧,这是有争议的。我曾提出LISP在某一点上至少是合理的主流。不过,这很公平,JavaScript的语义是直接受Scheme启发的,它的受众肯定比其他任何可以提出类似主张的语言都要多。


请参阅由卢卡斯·琼斯(Lucas Jones)Google图书链接发布的链接,在那里他可以转到我正在谈论的确切页面。感谢您的回答。
苏希尔bharwani

5
之所以将JavaScript描述为“第一个”是因为该语句符合“进入主流”的条件。我认为很明显,JavaScript确实是日常程序员在日常工作中使用的第一种功能样式语言。
rfunduk

1
当您说编程语言的“功能风格”时,您是什么意思。我来自Java背景,试图学习javascript有何不同。
sushil bharwani 2010年

9
这是一个巨大的话题。去年,我到了您现在的位置:我找到了Crockford的论文和讲座,并想了解闭包。我建议您先从Wikipedia开始,然后再继续写几篇文章:John Hughes“功能编程为何重要” scribd.com/doc/26902/whyfp,Slava Akhmechet“我们其余人的功能编程” defmacro.org/ramblings /fp.html有很多书籍可以扩大您的视野:查看Little Schemer以获得对Scheme的感觉,然后继续进行计算机程序的结构和解释。
michiakig 2010年

5
@sushil:关于这个主题有很多介绍性文献。总的来说,它是一种编程风格,强调将程序视为数学对象,而不是顺序指令或抽象对象之间的交互。例如,功能语言将首选递归而不是迭代,使用不可变的数据结构,并优先使用高阶函数,而不是“功能对象”或“策略模式”。高阶函数表示可以对其他函数(作为参数)或屈服(作为返回值)的函数。
德里克·特克

48

简单来说,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
“ Lisp已被广泛使用”是谁?我一直都知道它,因为教授们总是会讨论它,但是实际上,我从未见过使用过Lisp的人。我想说的是,任何人都可以找到认识的人使用过Javascript,这使Javascript更加“主流”。
palswim 2010年

“ PHP 5添加了对lambda函数的支持”。实际上,PHP 5.3引入了lambda函数。
Crozin

我见过的很少有人在商业环境中使用过它,但是就像Pascal曾经那样,它在教育环境中被广泛使用。
Juan Mendes

4

他指的是Lambda演算

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

untyped lambda演算是函数式编程(尤其是Lisp)的原始灵感,而typed lambda calculi则是现代类型系统的基础。


4

我看到过一个lambda,它定义为匿名函数和对函数的引用。Javascript同时支持:

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

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

这就是JS获得其强大功能和灵活性的地方。Java在某种程度上支持前一种(匿名接口实现),但不支持后者 -有关Java 8的更新,请参见下文。

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

JS绝对不是支持这些功能的第一语言。从记忆的角度出发,我认为语言爱好者一直热衷于支持lambda的话题。

顺便说一句:在Java中,匿名类通常用于动态传递一个类定义作为参数(经常使用)。这样的事情(从内存中,未编译):

someGuiContainer(new WidgetInterface()
      {
           public void importantMethodToDefine(){
             // Handle having the method called in my special widget way
           }
        }
)

更新资料

从8开始,Java现在正式是Lambda语言。

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

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

代码源


1

在麻省理工学院的开放式课件中,称为“计算机程序的结构和解释”,由哈尔·阿伯森(Hal Abelson),杰里·萨斯曼(Jerry Sussman)和朱莉·萨斯曼(Julie Sussman)所著。他们讨论了Scheme,这是LISP的一种方言,在那里他们解释了lambda是什么以及Scheme LISP和一般语言的非常详细和清晰的解释。如果您希望对计算机编程有一个真正清晰而深刻的理解,我强烈建议您看一下。向您解释要花费去那里的时间是您去那里读书或观看教程的三倍,这真是天才。

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


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

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

  • 属性:如果立即执行某个功能或短期使用,而无需为该功能命名,则需要该功能。

  • 它不同于Java,C,C ++和PHP之类的语言,例如JS。匿名函数用于闭合和处理。

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.