Давайте сначала упростим код:
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;
}
Теперь понятно, к чему относится х? х - параметр для функции «Магия».
Теперь вы можете использовать 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 превращает одну функцию из двух параметров в две функции по одному параметру каждый .
Имеет смысл?