对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
在CS的上下文中,lambda函数是一个抽象的数学概念,它解决了数学表达式的符号求值问题。在这种情况下,lambda函数与lambda项相同。
但在编程语言中,这是不同的。这是一段被宣布为“到位”的代码,可以作为“一流公民”传递。这个概念似乎很有用,因此它几乎进入了所有流行的现代编程语言(参见lambda函数everwhere post)。
其他回答
“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)
确切的符号因语言而异;希腊语并不总是必需的!;-)
@Brian我一直在C#、LINQ和非LINQ运算符中使用lambdas。例子:
string[] GetCustomerNames(IEnumerable<Customer> customers)
{ return customers.Select(c=>c.Name);
}
在C#之前,我在JavaScript中使用匿名函数来回调AJAX函数,甚至在AJAX这个词出现之前:
getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});
不过,C#lambda语法的有趣之处在于,它们本身的类型无法推断(即,您不能键入var foo=(x,y)=>x*y),但根据它们被分配给的类型,它们将被编译为表示表达式的委托或抽象语法树(这就是LINQ对象映射器如何实现“语言集成”的魔力)。
LISP中的Lambdas也可以传递给引号运算符,然后作为列表列表进行遍历。一些强大的宏是这样生成的。
例如,在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]()()();
这个问题已经得到了充分的回答,我不想详述。我想分享在rust中编写数值计算时的用法。
有一个lambda(匿名函数)的示例
let f = |x: f32| -> f32 { x * x - 2.0 };
let df = |x: f32| -> f32 { 2.0 * x };
当我写牛顿-拉斐逊方法的一个模块时,它被用作一阶导数和二阶导数。(如果您想知道什么是牛顿-拉斐逊法,请访问“https://en.wikipedia.org/wiki/Newton%27s_method".
输出如下
println!("f={:.6} df={:.6}", f(10.0), df(10.0))
f=98.000000 df=20.000000
这个问题已经得到了正式的回答,因此我不会试图对此做更多的补充。
对于一个对数学或编程知之甚少或一无所知的人来说,用非常简单、非正式的话来说,我会把它解释为一个小的“机器”或“盒子”,它接受一些输入,产生一些工作,产生一些输出,没有特定的名称,但我们知道它在哪里,就凭这些知识,我们使用它。
实际上,对于一个知道函数是什么的人来说,我会告诉他们这是一个没有名字的函数,通常放在内存中的一个点上,只需引用该内存即可使用(通常通过使用一个变量-如果他们听说过函数指针的概念,我会将其用作类似的概念)-这个答案涵盖了非常基本的内容(没有提到闭包等),但人们可以很容易地理解这一点。