当前位置:  开发笔记 > 编程语言 > 正文

什么是lambda,什么是示例实现?

如何解决《什么是lambda,什么是示例实现?》经验,为你挑选了4个好方法。

我对编程很新,在做很多阅读时,这个lambda的概念不断出现,但是我很难理解它实际上是什么,如何实现它将使我的编程生活变得更好.首先,什么是lambda,第二,它是如何实现的?

感谢所有发布的人.正如评论中提到的,这是重复的,但是这里有很多很棒的答案,我想为社区保留它们,所以我把它变成了一个社区帖子.以下是其他问题的链接:

什么是lambda(函数)?



1> e-satis..:

Lambda很难捕捉到,但是一旦你想象它们,你就无法理解为什么你之前没有得到它.

Lamdba是匿名函数

Lambda是普通的函数,唯一的区别是你不给它们起一个名字.

要理解这一点,首先必须知道,在创建函数时,代码将存储在内存中,只能由计算机知道.

所以当你做那样的事情时:

function Foo ()
{
 /* your code here */
}

你真正做的是将名称"Foo"绑定到内存中代码的地址.

现在,还有另一种访问地址的方法:引用(和指针,但让我们跳过这些讨厌的人)

嗯,lambda函数是一个没有名称的函数,所以它只能通过它的引用访问.

你怎么用它们?

创建lambda函数时,通常只计划使用一次.

一步一步的过程通常是:

    创建功能

    获得参考

    将引用传递给它将被使用的地方

最后,引用丢失,因此函数被自动销毁.

典型的用例是回调函数.你在一行中声明,创建和传递函数,所以它很方便.

来自真实单词的例子

在Python中,您可以在列表推导中使用lambda:

/* create a list of functions */
function_list = [(lambda x : number_to_add + x) for number_to_add in range(0, 10) ]

在Javascript中,您通常将函数传递给其他函数.JQuery示例:

 $("img").each(

 /* here we pass a function without any name to the "each()" method   */

 function(i){  his.src = "test"   i   ".jpg"; }

 );

你最了解的事情

有些语言,如Javascript或Lisp,大量使用lambdas.它可能是出于文化原因,但函数式编程范式往往会导致lambda-mania.

长lambdas使代码难以阅读.这就是为什么有些语言限制了lambdas的可能性,例如Python中不允许使用"if"语句.

Lambdas只是正常的功能.无论你使用哪一个,你都可以使用普通的功能.这只是编码风格的问题.


是的,但你怎么解释那个从未使用过简单单词的lisp或LINQ的人呢?祝好运.

2> Mehrdad Afsh..:

lambda是函数的内联描述.它起源于函数式编程语言,并且支持类似于它的其他语言的数量正在增长.这个名字来源于一个名为Lambda演算的数学事物,它影响了函数式编程语言(如Lisp),lambdas的思想来源于它.

您的问题取决于您所谈论的编程语言.例如,在F#中,您将fun x -> x * x用来表示

int myfunction(int x) { return x * x; }

在C#中,您将使用x => x * x表示相同的函数.如何使用它以及你可以用它做什么几乎取决于你正在使用的语言.

谈到C#,关于它们的好处是能够将它们解析为表达式树.lambda表达式可以用作代码,如表达式树中的委托(大致是函数指针)或数据.使用它们作为表达式树,使LINQ to SQL等库能够使用表达式创建SQL语句,以便提交给服务器并获得适当的结果.


.lambda表达式可以用作代码,如表达式树中的

3> Norman Ramse..:

Lambda是一种创建匿名函数或闭包的方法.在命令式语言(和功能性语言)中,它等同于允许嵌套函数,其中内部函数可以访问局部变量和封闭函数的参数.它在功能性语言中的关键字下lambda,fun,fn甚至\; 在Smalltalk中,它被称为.它也可以在大多数脚本语言中找到,例如Perl,Python,Lua等.

关于没有 lambda 的唯一语言是

没有嵌套函数的语言,如标准C或图标

具有第二类嵌套函数的语言---函数可能无法从函数返回,存储在全局变量中或存储在堆分配的数据结构中.该语系包括Pascal及其Modula,Ada和CLU系列的后代.

Lambda对程序员和编译器编写者有重要意义:不再可能将所有局部变量存储在堆栈中.相反,可以捕获一些变量并将其存储在堆分配的闭包中.请注意,当您编写lambda时,您正在编写分配.

示例:最简单的函数之一是组合(Haskell语法):

compose f g = \x -> f (g x)

这表示它compose接受两个函数fg作为参数,并返回一个匿名函数,该函数接受其参数x然后应用g然后再f执行x.一个应用程序compose创建一个在堆上分配闭包,它存储lambda 的值的代码fg指针的值.在lambda常见的语言中,例如Haskell,ML,Caml和Scheme,已经花费了大量的精力使得分配速度非常快.一些脚本语言,例如Lua,具有不寻常的实现,这使得非lambda案例与命令式语言相同,同时也使lambda变得相当快.Lambda在Smalltalk中也很快,它也被设计为在堆上分配大量对象.在lambda被改装的语言中,如Perl或Java(内部类与lambda相关),费用可能相对更高.

一般来说,如果一种语言在设计时考虑了lambdas,你可以随意使用它们.特别是在ML,Caml,Scheme,Haskell,甚至匿名功能都很便宜 ---使用它们很多!



4> Johannes Sch..:

编程世界中的lambda意味着一个匿名函数,可以像其他正常变量一样传递和返回.所谓的函数式语言已经内置了,但最近有越来越多的语言支持它们,因为它们允许编写可重用的代码.例如,请参阅下一版本的C++中编写的内容:

// write this once...
int transform_values(int * values, int n, function f) {
    for(int i = 0; i < n; i++)
        values[i] = f(values[i]);
}

int values[] = { 1, 2, 3, 4 };
// ... then call it to double the values in an array
transform_values(values, 4, [](int v) { return v * 2; });

它在C#和支持lambdas的其他语言中看起来很相似.现在有"封闭"这个词.这意味着lambda可以捕获局部变量并在计算结果时使用它们:

int local_variable = 5;
int values[] = { 1, 2, 3, 4 };
// ... then call it to multiply the values in an array
transform_values(values, 4, [=](int v) { return v * local_variable; });

变量local_variable现在被捕获在闭包内,可以在其中使用.变量也可以通过闭包更新.Lambdas是函数式语言的基本构建块.这是haskell的一个例子:

map (\x -> x * 2) [1, 2, 3, 4]

将与上面的C++代码相同.它使用给定函数(此处为lambda)将列表中的值映射到结果列表中.使用haskell,你可以很好地看到语法如何映射到Lambda微积分的数学概念.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有