什么是lambda(函数)?

对于没有comp-sci背景的人来说,计算机科学世界中的lambda是什么?


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

为什么这很酷? 它允许你编写快速抛出函数而不用命名它们。 它还提供了编写闭包的好方法。 用这种力量,你可以做这样的事情。

蟒蛇

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

从Python的片段中可以看到,函数加法器接受一个参数x,并返回一个匿名函数或lambda,它接受另一个参数y。 该匿名函数允许您从函数创建函数。 这是一个简单的例子,但它应该传达权力lambda和闭包。

其他语言的示例

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

方案

(define adder
    (lambda (x)
        (lambda (y)
           (+ x y))))
(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();

哈斯克尔

(x y -> 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外,你通常还会有某种类型的变量可以存放对函数,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);
}

这称为计算器,不仅传递两个数字,还传递计算器中调用哪种方法以获取计算结果。

在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微积分,它是一个只有lambda表达式的正式系统,它表示一个函数,它为其唯一参数提供一个函数并返回一个函数。 λ演算中的所有函数都属于这种类型,即λ : λ → λ

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

(lambda (x y) (* x y)) 

它可以像这样在线应用(评估为50):

((lambda (x y) (* x y)) 5 10)
链接地址: http://www.djcxy.com/p/6781.html

上一篇: What is a lambda (function)?

下一篇: Implementation of a work stealing queue in C/C++?