对于一个没有计算机科学背景的人来说,计算机科学界的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函数那样被翻译出来。

因为我在这里看不到C++11示例,所以我将继续在这里发布这个很好的示例。经过搜索,这是我能找到的最清晰的语言特定示例。

你好,Lambdas,版本1

template<typename F>

void Eval( const F& f ) {
        f();
}
void foo() {
        Eval( []{ printf("Hello, Lambdas\n"); } );
}

你好,Lambdas,版本2:

void bar() {
    auto f = []{ printf("Hello, Lambdas\n"); };
    f();
}

lambda函数可以接受任意数量的参数,但它们只包含一个表达式。。。Lambda函数可用于返回函数对象。语法上,lambda函数仅限于一个表达式。

这个问题已经得到了充分的回答,我不想详述。我想分享在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

想象一下,你有一家餐厅提供送货服务,你的订单需要在30分钟内完成。关键是客户通常不在乎你是骑自行车送食物还是赤脚送食物,只要你保持食物的温度并系好。因此,让我们将这个习惯用法转换为带有匿名和定义的传输函数的Javascript。

下面我们定义了交付的方式,也就是我们定义了函数的名称:

// ES5 
var food = function withBike(kebap, coke) {
return (kebap + coke); 
};

如果我们使用箭头/lambda函数来完成此传输会怎么样:

// ES6    
const food = (kebap, coke) => { return kebap + coke };

你看,对客户来说并没有什么区别,也并没有浪费时间去思考如何发送食物。只要发送它。

顺便说一句,我不推荐用可乐烤串,这就是为什么上面的代码会给你错误。玩得高兴