# 什么是lambda（函数）？

### 18 Solutions collect form web for “什么是lambda（函数）？”

Lambda来自Lambda微积分 ，指的是编程中的匿名函数。

python

``def adder(x): return lambda y: x + y add5 = adder(5) add5(1) 6` `

JavaScript的

` `var adder = function (x) { return function (y) { return x + y; }; }; add5 = adder(5); add5(1) == 6` `

JavaScript（ES6）

` `const adder = x => y => x + y; add5 = adder(5); add5(1) == 6` `

scheme

` `(define adder (lambda (x) (lambda (y) (+ xy)))) (define add5 (adder 5)) (add5 1) 6` `

C＃3.5或更高版本

` `Func<int, Func<int, int>> adder = (int x) => (int y) => x + y; // `int` declarations optional Func<int, int> add5 = adder(5); var add6 = adder(6); // Using implicit typing Debug.Assert(add5(1) == 6); Debug.Assert(add6(-1) == 5); // Closure example int yEnclosed = 1; Func<int, int> addWithClosure = (x) => x + yEnclosed; Debug.Assert(addWithClosure(2) == 3);` `

` `func adder(x: Int) -> (Int) -> Int{ return { y in x + y } } let add5 = adder(5) add5(1) 6` `

PHP

` `\$a = 1; \$b = 2; \$lambda = function () use (&\$a, &\$b) { echo \$a + \$b; }; echo \$lambda();` `

` `(\xy -> x + y)` `

Java的

` `// The following is an example of Predicate : // a functional interface that takes an argument // and returns a boolean primitive type. Predicate<Integer> pred = x -> x % 2 = 0; // Tests if the parameter is even. boolean result = pred.test(4); // true` `

LUA

` `adder = function(x) return function(y) return x + y end end add5 = adder(5) add5(1) == 6 -- true` `

lambda是一种内联定义的函数。 随着一个lambda你通常也有某种variablestypes可以容纳一个函数，lambda或其他的引用。

` `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); }` `

` `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; }); }` `

` `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); }` `

Lisp使用lambda概念来命名匿名函数文字。 这个lambda表示一个函数，它接受两个参数x和y，并返回它们的产品：

` `(lambda (xy) (* xy))` `

` `((lambda (xy) (* xy)) 5 10)` `

` `args.foreach(arg => println(arg))` `

` `void printThat(Object that) { println(that) } ... args.foreach(printThat)` `

1. 在其他地方声明函数（以后再次访问代码时必须查找它）。
2. 命名你只用了一次的东西。

` `int tempVar = 2 * a + b ... println(tempVar)` `

` `println(2 * a + b)` `

lambda演算是一个一致的math替代理论。 在学校的math中，例如`x+y=5``x−y=1`配对。 除了操纵单个方程式的方法之外，还可以将来自这两个方程的信息放在一起，只要逻辑地完成交叉方程replace。 Lambda演算编码正确的方法来做这些replace。

` `int square(int x) { return x * x; }` `

variablesx是一个forms参数，被函数调用时的实际值取平方。 在函数式语言（Scheme）中，将定义相同的函数：

` `(define square (lambda (x) (* xx)))` `

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

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

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

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

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

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

Ruby中的lambda示例如下所示：

` `hello = lambda do puts('Hello') puts('I am inside a proc') end hello.call` `

` `Hello I am inside a proc` `

@Brian在LINQ和非LINQ运算符中，我总是在C＃中使用lambdas。 例：

` `string[] GetCustomerNames(IEnumerable<Customer> customers) { return customers.Select(c=>c.Name); }` `

` `getXmlFromServer(function(result) {/*success*/}, function(error){/*fail*/});` `

LISP中的Lambdas也可以传递给引用操作符，然后遍历为列表的列表。 一些强大的macros是这样做的。

` `? Calculator(10, 23, "a + b") ? Calculator(10, 23, "a - b"); FUNCTION Calculator(a, b, op) RETURN Evaluate(op)` `

# 你好，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(); }` `

` `numberCollection.GetMatchingItems<int>(number => number > 5);` `

` `number => number > 5` `

` `var addAndMult = function(x) { return (function(y) { return (function(z) { return (x+y)*z; }); }); };` `

` `var forEach = function(arr) { return (function(x) { for (var i=0; arr[i]; i++) { x(arr[i]); } }); }` `

` `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]()()();` `

• C＃joinLinq和Lambda
• 是否有一个C＃在foreach中重用该variables的原因？
• 在Java8中引入lambdas会改变或影响哪个GoFdevise模式？
• “System.Int32”types的expression式不能用于返回types“System.Object”
• 如何编写一个VB.Net Lambdaexpression式
• 为什么lambda转换为值为true的布尔值？
• genericslambda如何在C ++ 14中工作？
• 有没有可能在匿名函数中设置断点？
• 有没有办法指定一个“空”的C＃lambdaexpression式？
• 使用Foreach子句的Lambdaexpression式
• c ++ 0x：通过引用接收lambda作为参数的正确方法