需要帮助了解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表达式