需要帮助了解lambda(currying)

我正在阅读Accelerated C#我真的不明白以下代码:

public static Func Bind2nd ( this Func func, TArg2 constant ) { return (x) => func( x, constant ); } 

在最后一行x指的是什么? 还有另一个:

 public static Func<TArg2, Func> Bind2nd ( this Func func ) { return (y) => (x) => func( x, y ); } 

我该如何评价这个? (y) => (x) => func( x, y )传递的地方……它确实令人困惑。

我们先简化一下代码:

 Func B(Func f, int c) { return x=>f(x, c); } 

这与以下内容相同:

 class Locals { public int c; public Func f; public int Magic(int x) { return f(x, c); } } Func B(Func f, int c) { Locals locals = new Locals(); locals.f = f; locals.c = c; return locals.Magic; } 

现在很清楚x指的是什么? x是“Magic”function的参数。

现在你可以像这样使用B:

 Func adder = (a, b)=>a+b; Func addTen = B(adder, 10); int thirty = addTen(20); 

合理? 看看这里发生了什么? 我们采用两个参数的函数,并将其中一个参数“固定”为常量。 所以它成为一个参数的函数。

第二个例子更进了一步。 再次,简化以摆脱残余,以便您可以更容易地理解它:

 Func> B2(Func f) { return y=>x=>f(x,y); } 

这是一样的

 class Locals3 { public int y; public int Magic3(int x) { return x + this.y; } } class Locals2 { public Func f; public Func Magic2(int y) { Locals3 locals = new Locals3; locals.y = y; return locals.Magic3; } } Func> B2(Func f) { Locals2 locals = new Locals2(); locals.f = f; return locals.Magic2; } 

所以你说

 Func adder = (a, b)=>a+b; Func> makeFixedAdder = B2(adder); Func add10 = makeFixedAdder(10); int thirty = add10(20); 

B是参数修复器。 B2 为您制作参数修复工具

但是,这不是B2的重点。 B2的重点是:

 adder(20, 10); 

给出了相同的结果

 B2(adder)(20)(10) 

B2 将两个参数的一个函数转换为每个参数的两个函数

合理?

x是lambda的参数,它的类型为TArg1。

将=>发音为“映射到”可能会有所帮助,如“x映射到新函数,其中TArg2类型的常量替换为原始函数委托,func”。

变量x是未绑定的变量。 这表示调用Bind2nd返回函数的参数。

有几个小时的计划会帮助你,但试试这个。

当您调用Bind2nd ,返回的结果是一个函数。 该function定义为

 (x) => func (x, constant) 

现在您已将上面的内容分配给变量,让我们说lambda ,您可以通过lambda变量调用该函数

 lambda(x); 

Bind2nd定义的x只是一个变量,表示将返回给您的函数的参数。

lambda表达式是匿名方法的简写。 与匿名方法一样,lambda表达式也分配给委托类型。 适用于匿名方法的所有条件也适用于lambda表达式。

=>被称为lambda运算符,读作“转到”。 运算符的左侧指定以逗号分隔的输入参数,右侧指定称为lambda body的表达式或语句块。 (p1,p2,p3,… pN)=>表达式如果只有一个参数,则可以跳过括号p1 => expression;

我写了一个小博客,解释Lambda表达式中的lambda表达式