对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
例如,在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]()()();
其他回答
在CS的上下文中,lambda函数是一个抽象的数学概念,它解决了数学表达式的符号求值问题。在这种情况下,lambda函数与lambda项相同。
但在编程语言中,这是不同的。这是一段被宣布为“到位”的代码,可以作为“一流公民”传递。这个概念似乎很有用,因此它几乎进入了所有流行的现代编程语言(参见lambda函数everwhere post)。
我喜欢这篇文章中对Lambdas的解释:LINQ的演变及其对C#设计的影响。这对我来说很有意义,因为它为Lambdas展示了一个真实的世界,并将其作为一个实际的例子。
他们的快速解释:Lambdas是将代码(函数)视为数据的一种方式。
这个问题已经得到了正式的回答,因此我不会试图对此做更多的补充。
对于一个对数学或编程知之甚少或一无所知的人来说,用非常简单、非正式的话来说,我会把它解释为一个小的“机器”或“盒子”,它接受一些输入,产生一些工作,产生一些输出,没有特定的名称,但我们知道它在哪里,就凭这些知识,我们使用它。
实际上,对于一个知道函数是什么的人来说,我会告诉他们这是一个没有名字的函数,通常放在内存中的一个点上,只需引用该内存即可使用(通常通过使用一个变量-如果他们听说过函数指针的概念,我会将其用作类似的概念)-这个答案涵盖了非常基本的内容(没有提到闭包等),但人们可以很容易地理解这一点。
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”这个名字只是一个历史产物。我们所谈论的只是一个表达式,其值是一个函数。
一个简单的例子(下一行使用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)
确切的符号因语言而异;希腊语并不总是必需的!;-)