我们先简化一下代码:
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将两个参数的一个函数变成一个参数的两个函数。
有道理?