对于一个没有计算机科学背景的人来说,计算机科学界的lambda是什么?
当前回答
你可以把它看作一个匿名函数-这里有更多信息:Wikipedia-匿名函数
其他回答
这个问题已经得到了正式的回答,因此我不会试图对此做更多的补充。
对于一个对数学或编程知之甚少或一无所知的人来说,用非常简单、非正式的话来说,我会把它解释为一个小的“机器”或“盒子”,它接受一些输入,产生一些工作,产生一些输出,没有特定的名称,但我们知道它在哪里,就凭这些知识,我们使用它。
实际上,对于一个知道函数是什么的人来说,我会告诉他们这是一个没有名字的函数,通常放在内存中的一个点上,只需引用该内存即可使用(通常通过使用一个变量-如果他们听说过函数指针的概念,我会将其用作类似的概念)-这个答案涵盖了非常基本的内容(没有提到闭包等),但人们可以很容易地理解这一点。
它是一个没有名称的函数。例如,在c#中,您可以使用
numberCollection.GetMatchingItems<int>(number => number > 5);
返回大于5的数字。
number => number > 5
这里是lambda部分。它表示一个接受参数(数字)并返回布尔值(数字>5)的函数。GetMatchingItems方法对集合中的所有项使用此lambda并返回匹配项。
Lambda函数或小型匿名函数是一个自包含的功能块,可以在代码中传递和使用。Lambda在不同的编程语言中有不同的名称——Python和Kotlin中的Lambda,Swift中的闭包,或者C和Objective-C中的Block。虽然lambda在这些语言中的含义非常相似,但有时会有细微差别。
让我们看看Closure(Lambda)在Swift中的工作原理:
let coffee: [String] = ["Cappuccino", "Espresso", "Latte", "Ristretto"]
1.正则函数
func backward(_ n1: String, _ n2: String) -> Bool {
return n1 > n2
}
var reverseOrder = coffee.sorted(by: backward)
// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]
2.闭包表达式
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
return n1 > n2
})
3.内联闭包表达式
reverseOrder = coffee.sorted(by: { (n1: String, n2: String) -> Bool in
return n1 > n2
})
4.根据上下文推断类型
reverseOrder = coffee.sorted(by: { n1, n2 in return n1 > n2 } )
5.单表达式闭包的隐式返回
reverseOrder = coffee.sorted(by: { n1, n2 in n1 > n2 } )
6.速记参数名称
reverseOrder = coffee.sorted(by: { $0 > $1 } )
// $0 and $1 are closure’s first and second String arguments.
7.操作员方法
reverseOrder = coffee.sorted(by: >)
// RESULT: ["Ristretto", "Latte", "Espresso", "Cappuccino"]
lambda是一种内联定义的函数类型。除了lambda之外,通常还有某种类型的变量类型,可以保存对函数lambda或其他函数的引用。
例如,这里有一段不使用lambda的C#代码:
public Int32 Add(Int32 a, Int32 b)
{
return a + b;
}
public Int32 Sub(Int32 a, Int32 b)
{
return a - b;
}
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, Add);
Calculator(10, 23, Sub);
}
这调用Calculator,不仅传递两个数字,还传递要在Calculator中调用的方法以获得计算结果。
在C#2.0中,我们得到了匿名方法,这将上述代码缩短为:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a + b;
});
Calculator(10, 23, delegate(Int32 a, Int32 b)
{
return a - b;
});
}
然后在C#3.0中,我们得到了lambdas,这使得代码更短:
public delegate Int32 Op(Int32 a, Int32 b);
public void Calculator(Int32 a, Int32 b, Op op)
{
Console.WriteLine("Calculator: op(" + a + ", " + b + ") = " + op(a, b));
}
public void Test()
{
Calculator(10, 23, (a, b) => a + b);
Calculator(10, 23, (a, b) => a - b);
}
在计算机编程中,lambda是一段代码(语句、表达式或一组代码),它从外部源获取一些参数。它不能总是一个匿名函数——我们有很多方法来实现它们。
我们在表达式、语句和函数之间有明确的区分,而数学家没有这种区分。
编程中的“函数”一词也有所不同——我们有“函数是一系列要做的步骤”(来自拉丁语“perform”)。在数学中,它是关于变量之间的相关性。
函数语言正试图尽可能地与数学公式相似,它们的单词意思几乎相同。但在其他编程语言中,我们有不同之处。