首先让我们简化代码:
Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}
这只是与以下语句等同:
class Locals
{
public int c;
public Func<int, int, int> f;
public int Magic(int x) { return f(x, c); }
}
Func<int, int> B(Func<int, int, int> f, int c)
{
Locals locals = new Locals();
locals.f = f;
locals.c = c;
return locals.Magic;
}
现在你清楚 x 指的是什么了吗?x 是 "Magic" 函数的参数。
现在你可以像这样使用 B:
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);
明白吗?你看到这里发生了什么吗?我们将一个有两个参数的函数中的一个参数“固定”为常数,这样它就变成了一个只有一个参数的函数。
第二个例子更进一步。同样地,简化以消除冗杂内容,以便更容易理解:
Func<int, Func<int, int>> B2(Func<int, int, int> 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<int, int, int> f;
public Func<int, int> Magic2(int y)
{
Locals3 locals = new Locals3;
locals.y = y;
return locals.Magic3;
}
}
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
Locals2 locals = new Locals2();
locals.f = f;
return locals.Magic2;
}
那么你说
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, Func<int, int>> makeFixedAdder = B2(adder);
Func<int, int> add10 = makeFixedAdder(10);
int thirty = add10(20);
B是一个参数修复工具。B2可以为您创建一个参数修复工具。
然而,这不是B2的关键点。B2的关键点在于:
adder(20, 10);
得到的结果与
B2(adder)(20)(10)
B2将一个带有两个参数的函数转换为每个参数只有一个参数的两个函数。
听懂了吗?