什么是lambda(函数)?
对于没有计算机科学背景的⼈来说,计算机科学世界中的是什么?
#1楼
只是因为我在这⾥看不到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();
}
#2楼
例如,在Javascript中,函数与其他所有类型( int , string , float , bool )被视为相同的混合类型。 这样,您可以即时创建函数,将其分配给事物,然后稍后再调⽤它们。 这很有⽤,但不是您想要过度使⽤的东西,否则您将使必须维护代码的所有⼈感到困惑。
这是我正在玩的⼀些代码,以查看此兔⼦洞的深度:
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]()()();
#3楼
我也知道 我已经⽤这个在JS中尝试过:
var addAndMult = function(x) {
return (function(y) {
return (function(z) {
return (x+y)*z;
});
});
};
它将2加到4,然后将结果乘以6。但是,我发现有时很难阅读:(
我也做了⼀个有趣的forEach函数:
var forEach = function(arr) {
return (function(x) {
for (var i=0; arr[i]; i++) {
x(arr[i]);
}
});
}
forEach([1,2,3,4,5])(console.log);
在打印到控制台的情况下,此⽅法将迭代数组并执⾏操作。 现在我也明⽩了为什么Labmdas功能强⼤。eval是做什么的
#4楼
它指的是 ,这是⼀个只有lambda表达式的形式系统,代表了⼀个函数,该函数接受唯⼀的参数作为函数并返回⼀个函数。 Lambda演算中的所有函数都是该类型,即λ : λ→λ 。
Lisp使⽤lambda概念来命名其匿名函数⽂字。 此lambda表⽰⼀个函数,该函数接受两个参数x和y,并返回其乘积:
(lambda (x y) (* x y))
可以像这样在线应⽤(评估为50 ):
((lambda (x y) (* x y)) 5 10)
#5楼
您可以将其视为匿名函数-以下是更多信息:
#6楼
Lambda来⾃ ,是指编程中的匿名函数。
为什么这很酷? 它允许您编写快速抛出的函数⽽⽆需命名它们。 它还提供了编写闭包的好⽅法。 有了这种能⼒,您就可以做这样的事情。
蟒蛇
def adder(x):
return lambda y: x + y
add5 = adder(5)
add5(1)
6
从Python⽚段中可以看到,函数加法器接受⼀个参数x,并返回⼀个匿名函数或lambda,该函数接受另⼀个参数y。 该匿名函数允许您从函数创建函数。 这是⼀个简单的⽰例,但它应该传达出lambda和闭包所具有的功能。
其他语⾔的例⼦
Perl 5
sub adder {
my ($x) = @_;
return sub {
my ($y) = @_;
$x + $y
}
}
my $add5 = adder(5);
print &$add5(1) == 6 ? "ok\n" : "not ok\n";
的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
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 = st(4); // true
a
adder = function(x)
return function(y)
return x + y
end
end
add5 = adder(5)
add5(1) == 6        -- true
科特林
val pred = { x: Int -> x % 2 == 0 }
val result = pred(4) // true
红宝⽯
Ruby稍有不同,因为您不能使⽤与调⽤函数完全相同的语法来调⽤lambda,但是它仍然具有lambda。
def adder(x)
lambda { |y| x + y }
end
add5 = adder(5)
add5[1] == 6
Ruby是Ruby,它是lambda的简写形式,因此您可以通过以下⽅式定义adder :
def adder(x)
-> y { x + y }
end
[R
adder <- function(x) {
function(y) x + y
}
add5 <- adder(5)
add5(1)
#> [1] 6
#7楼
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);
}
这将调⽤Calculator,不仅传递两个数字,⽽且传递在Calculator内部调⽤哪种⽅法以获取计算结果。
在C#2.0中,我们获得了匿名⽅法,该⽅法将上述代码缩短为:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。