什么是 lambda 语言?

Posted

技术标签:

【中文标题】什么是 lambda 语言?【英文标题】:What is a lambda language? 【发布时间】:2011-04-21 09:20:16 【问题描述】:

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

JavaScript 的函数是具有(大部分)词法作用域的一流对象。 JavaScript 是第一个成为主流的 lambda 语言。在内心深处,JavaScript 与 Lisp 和 Scheme 的共同点比与 Java 的更多。它是 C 中的 Lisp。这使得 JavaScript 成为一种非常强大的语言。

我不明白什么是 lambda 语言。这种语言的特性是什么?它与 Java、C、C++ 和 php 等语言有什么不同?

【问题讨论】:

Lambda 表示匿名表达式。所以 lambda 语言 -> 带有匿名表达式的语言 Google 图书链接,仅供参考:books.google.co.uk/… 参见***上的lambda calculus。 很多很好的回复。到目前为止,我所理解的是,如果您使用的是匿名函数,那么您正在使用 lambda 语言。是否正确理解 lamda 语言与 java 之类的语言有何不同。 “我正在阅读“JavaScript:好的部分”,作者提到 JavaScript 是第一个推出的 lambda 语言。”所以我用谷歌搜索了 lambda 语言并在 SO 上找到了这个问题 :) 【参考方案1】:

简单来说,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)

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

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

【讨论】:

“Lisp 被广泛使用”是谁?我一直都知道,因为教授总是会讨论它,但在实践中,我从未见过任何使用过 Lisp 的人。我想说任何人都可以找到他们认识的使用过 Javascript 的人,这使得 Javascript 更加“主流”。 “PHP 5 增加了对 lambda 函数的支持”。实际上我是 PHP 5.3 引入了 lambda 函数。 我见过很少有人在商业环境中使用它,但就像 Pascal 曾经一样,它被广泛用于教育环境。【参考方案2】:

我从未听说有人使用过“lambda 语言”这个术语,而我能想到的唯一合理的定义是将 JavaScript 排除在“第一个”之外。

也就是说,我怀疑他的意思可能是:

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

这两种用法都源自使用希腊字母 lambda 来表示 lambda 演算中的函数抽象,这是 Alonzo Church 设计的计算模型,函数式编程正是基于此。

编辑:查看 Google 图书结果---“首先成为主流”;嗯,这是有争议的。我提出 LISP 在某一时刻至少是相当主流的。这是一个公平的观点,JavaScript 的语义直接受到 Scheme 的启发,而且它肯定比任何其他可以做出类似声明的语言都拥有更多的受众。

【讨论】:

请查看 Lucas Jones Google 图书链接发布的链接,他在该链接中转到了我正在谈论的确切页面。谢谢你的回答。 JavaScript 被描述为“第一”的原因是因为该声明符合“成为主流”。我认为很明显,JavaScript 确实是日常程序员在日常工作中使用的第一种函数式语言。 当您说编程语言的“函数式”时,您是什么意思。我来自 java 背景并试图学习 javascript 它有什么不同。 这是一个值得探索的巨大话题。去年我在你现在所处的位置:我找到了 Crockford 的论文和讲座,并想了解闭包。我建议您从 Wikipedia 开始,然后继续阅读几篇文章:John Hughes “为什么函数式编程很重要”scribd.com/doc/26902/whyfp、Slava Akhmechet “面向我们其他人的函数式编程”defmacro.org/ramblings/fp.html 有大量书籍可以扩展你的想法:查看 Little Schemer 以了解 Scheme,然后继续学习计算机程序的结构和解释。 @sushil:有很多关于这个主题的介绍性文献。但总的来说,它是一种编程风格,强调将程序视为数学对象,而不是顺序指令或抽象对象之间的交互。例如,函数式语言更喜欢递归而不是迭代,使用不可变的数据结构,使用高阶函数而不是“函数对象”或“策略模式”。高阶函数意味着可以对其他函数进行操作(作为参数)或产生(作为返回值)的函数。【参考方案3】:

他指的是Lambda calculus。

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

[...] 无类型 lambda 演算是函数式编程(尤其是 Lisp)的原始灵感,而有类型 lambda 演算则是现代类型系统的基础。

【讨论】:

【参考方案4】:

我见过一个定义为匿名函数和函数引用的 lambda。 Javascript 两者都支持:

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

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

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

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

JS 绝对不是第一个支持这些特性的语言。凭记忆,我认为语言爱好者总是热衷于支持 lambdas。

顺便说一句:在 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));

Code Source

【讨论】:

【参考方案5】:

Hal Abelson、Jerry Sussman 和 Julie Sussman 的一本书在 MIT 的名为“计算机程序的结构和解释”的开放课件中。他们讨论了 Scheme,这是 LISP 的一种方言,并在那里他们解释了一个非常详细和清晰的解释 lambda 是什么以及 Scheme LISP 和一般语言。如果您希望对计算机编程有一个非常清晰和深入的了解,我强烈建议您查看它。给你解释要花三倍的时间,就像你去那里看书或看教程一样,完美地解释了它,真是天才。

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

【讨论】:

【参考方案6】:

来自***: 在 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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

以上是关于什么是 lambda 语言?的主要内容,如果未能解决你的问题,请参考以下文章

编程语言中的Lambda 函数是如何产生的 它究竟有什么用

编程语言中的Lambda 函数是如何产生的 它究竟有什么用

Lambda表达式

功能样式:Lambda函数和映射

1.1 为什么要使用lambda 表达式

c++基础(lambda)