primero vamos a simplificar el código:
Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}
Esto es lo mismo que:
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;
}
Ahora es claro a que se refiere x? x es el parámetro para funcionar "Magia".
Ahora puede utilizar B como esto:
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);
sentido? ¿Ves lo que está pasando aquí? Estamos tomando una función de dos parámetros y "fijando" uno de los parámetros a una constante. Entonces se convierte en una función de un parámetro.
El segundo ejemplo lo lleva un paso más allá. Una vez más, simplificar para deshacerse de la costra de manera que se puede entender más fácilmente:
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
return y=>x=>f(x,y);
}
Esto es lo mismo que
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;
}
Así que decir
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 es una fijador de parámetros. B2 hace un fijador de parámetros para usted.
Sin embargo, ese no es el punto de B2. El punto de B2 es que:
adder(20, 10);
da el mismo resultado que
B2(adder)(20)(10)
B2 resulta una función de dos parámetros en dos funciones de un parámetro de cada.
¿Tiene sentido?
Debo decir gracias por su explicación detallada. Ahora incluso lo entiendo :) – Riaan