对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?


当前回答

lambda函数可以接受任意数量的参数,但它们只包含一个表达式。。。Lambda函数可用于返回函数对象。语法上,lambda函数仅限于一个表达式。

其他回答

lambda演算是一种一致的替代数学理论。例如,在学校数学中,人们可以看到x+y=5与x−y=1配对。除了处理单个方程的方法外,还可以将这两个方程的信息放在一起,前提是交叉方程的替换是合乎逻辑的。Lambda演算编纂了进行这些替换的正确方法。

假设y=x−1是第二个方程的有效重排,这:λy=x–1表示用符号x−1代替符号y的函数。现在想象将λy应用于第一个方程中的每个项。如果项是y,则执行替换;否则什么都不做。如果你在纸上这样做,你会看到应用λy将如何使第一个方程可解。

这是一个没有任何计算机科学或编程的答案。

我能想到的最简单的编程示例来自http://en.wikipedia.org/wiki/Joy_(编程语言)#如何工作:

下面是如何在命令中定义平方函数编程语言(C):int平方(int x){返回x*x;}变量x是一个形式参数,由实际调用函数时要平方的值。在函数中语言(方案)将定义相同的功能:(定义正方形(λ(x)(*x x)))这在很多方面都不同,但它仍然使用形式参数x以相同的方式。


补充:http://imgur.com/a/XBHub

它指的是lambda演算,这是一个只有lambda表达式的形式系统,lambda表达式表示一个函数,该函数将一个函数作为其唯一参数并返回一个函数。lambda演算中的所有函数都是这种类型的,即λ:λ→ λ.

Lisp使用lambda概念来命名其匿名函数文字。此lambda表示一个函数,它接受两个参数x和y,并返回它们的乘积:

(lambda (x y) (* x y)) 

它可以这样在线应用(计算为50):

((lambda (x y) (* x y)) 5 10)

“lambda”这个名字只是一个历史产物。我们所谈论的只是一个表达式,其值是一个函数。

一个简单的例子(下一行使用Scala)是:

args.foreach(arg => println(arg))

其中foreach方法的参数是匿名函数的表达式。上面的一行与编写类似的代码大致相同(不是真正的代码,但你会明白的):

void printThat(Object that) {
  println(that)
}
...
args.foreach(printThat)

除了你不需要麻烦:

在其他地方声明函数(稍后重新访问代码时必须查找它)。命名你只使用一次的东西。

一旦你习惯了函数值,就不得不不使用它们,就像需要命名每个表达式一样愚蠢,比如:

int tempVar = 2 * a + b
...
println(tempVar)

而不是只在需要的地方编写表达式:

println(2 * a + b)

确切的符号因语言而异;希腊语并不总是必需的!;-)

例如,在Javascript中,函数被视为与其他所有类型(int、string、float、bool)相同的混合类型。因此,您可以动态创建函数,将它们分配给对象,然后稍后再调用它们。它是有用的,但不是你想过度使用的东西,否则你会让所有在你之后必须维护代码的人感到困惑。。。

这是我玩的一些代码,看看这个兔子洞有多深:

var x = new Object;
x.thingy = new Array();
x.thingy[0] = function(){ return function(){ return function(){ alert('index 0 pressed'); }; }; }
x.thingy[1] = function(){ return function(){ return function(){ alert('index 1 pressed'); }; }; }
x.thingy[2] = function(){ return function(){ return function(){ alert('index 2 pressed'); }; }; }

for(var i=0 ;i<3; i++)
    x.thingy[i]()()();

你可以把它看作一个匿名函数-这里有更多信息:Wikipedia-匿名函数