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


当前回答

我喜欢这篇文章中对Lambdas的解释:LINQ的演变及其对C#设计的影响。这对我来说很有意义,因为它为Lambdas展示了一个真实的世界,并将其作为一个实际的例子。

他们的快速解释:Lambdas是将代码(函数)视为数据的一种方式。

其他回答

有点过于简单:lambda函数是一个可以传递给其他函数的函数,它的逻辑被访问。

在C#中,lambda语法通常以与匿名委托相同的方式编译为简单方法,但它也可以分解并读取其逻辑。

例如(在C#3中):

LinqToSqlContext.Where( 
    row => row.FieldName > 15 );

LinqToSql可以读取该函数(x>15)并将其转换为实际的SQL以使用表达式树执行。

上述声明变为:

select ... from [tablename] 
where [FieldName] > 15      --this line was 'read' from the lambda function

这与普通方法或匿名委托不同(它们实际上只是编译器的魔法),因为它们无法读取。

并非C#中所有使用lambda语法的方法都可以编译为表达式树(即实际的lambda函数)。例如:

LinqToSqlContext.Where( 
    row => SomeComplexCheck( row.FieldName ) );

现在无法读取表达式树-无法分解SomeComplexCheck。SQL语句将在没有where的情况下执行,数据中的每一行都将通过SomeComplexCheck进行处理。

Lambda函数不应与匿名方法混淆。例如:

LinqToSqlContext.Where( 
    delegate ( DataRow row ) { 
        return row.FieldName > 15; 
    } );

这也有一个“内联”函数,但这一次它只是编译器的魔法——C#编译器会将其拆分为一个具有自动生成名称的新实例方法。

匿名方法不能被读取,因此逻辑不能像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是什么?

我将用简单易读的python代码一步一步直观地说明它。

简而言之,lambda只是一个匿名内联函数。

让我们从作业开始,了解兰达斯作为一名有基础算术背景的新生。

任务蓝图为“名称=值”,请参见:

In [1]: x = 1
   ...: y = 'value'
In [2]: x
Out[2]: 1
In [3]: y
Out[3]: 'value'

“x”、“y”是名称,“1”、“value”是值。尝试数学中的函数

In [4]: m = n**2 + 2*n + 1
NameError: name 'n' is not defined

错误报告,不能将数学直接作为代码编写,“n”应该被定义或赋值。

In [8]: n = 3.14
In [9]: m = n**2 + 2*n + 1
In [10]: m
Out[10]: 17.1396

它现在起作用了,如果你坚持将两条seperarte线合并为一条呢。lambda来了

In [13]: j = lambda i: i**2 + 2*i + 1
In [14]: j
Out[14]: <function __main__.<lambda>>

未报告错误。

这是对lambda的一瞥,它使您能够像在数学中那样在单行中直接将函数写入计算机。

我们稍后再看。

让我们继续深入了解“任务”。

如上所示,等号=适用于简单数据(1和“value”)类型和简单表达式(n**2+2*n+1)。

试试看:

In [15]: x = print('This is a x')
This is a x
In [16]: x
In [17]: x = input('Enter a x: ')
Enter a x: x

它适用于简单的语句,在python7中有11种类型。简单语句-Python 3.6.3文档

复合陈述如何,

In [18]: m = n**2 + 2*n + 1 if n > 0
SyntaxError: invalid syntax
#or
In [19]: m = n**2 + 2*n + 1, if n > 0
SyntaxError: invalid syntax

出现了def使其工作

In [23]: def m(n):
    ...:     if n > 0:
    ...:         return n**2 + 2*n + 1
    ...:
In [24]: m(2)
Out[24]: 9

Tada,分析一下,“m”是名称,“n**2+2*n+1”是值是“=”的变体。找到它,如果只是为了理解,一切都从任务开始,一切都是任务。

现在返回lambda,我们有一个名为“m”的函数

Try:

In [28]: m = m(3)
In [29]: m
Out[29]: 16

这里有两个“m”的名称,函数m已经有一个重复的名称。

它的格式如下:

In [27]: m = def m(n):
    ...:         if n > 0:
    ...:             return n**2 + 2*n + 1
    SyntaxError: invalid syntax

这不是一个明智的策略,因此错误报告

我们必须删除其中一个,设置一个没有名称的函数。

m = lambda n:n**2 + 2*n + 1

它叫做“匿名函数”

总之,

内联函数中的lambda,它使您能够像数学中那样在一条直线上编写函数lambda是匿名的

希望,这有帮助。