Let zuerst den Code vereinfachen:
Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}
Dies ist genau das gleiche wie:
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;
}
Nun ist es klar, worauf bezieht sich x? x ist der Parameter für die Funktion "Magic".
Jetzt können Sie B wie folgt verwenden:
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);
Sinn? Siehst du, was hier passiert? Wir nehmen eine Funktion von zwei Parametern und "fixieren" einen der Parameter zu einer Konstante. Es wird also eine Funktion eines Parameters.
Das zweite Beispiel geht einen Schritt weiter. Wieder vereinfachen des cruft loszuwerden, damit Sie es leichter verstehen:
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
return y=>x=>f(x,y);
}
Dies ist die gleiche wie
ist
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;
}
So sagen Sie
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 a Parameterfixierer. B2 macht einen Parameter-Fixierer für Sie.
Das ist jedoch nicht der Punkt von B2. Der Punkt ist, dass B2:
adder(20, 10);
das gleiche Ergebnis wie
B2(adder)(20)(10)
B2 gibt schaltet eine Funktion von zwei Parametern in zwei Funktionen eines Parameters jedes.
Sinn machen?
Ich muss mich bedanken für Ihre ausführliche Erklärung. Jetzt verstehe ich es auch :) – Riaan