Jie*_*eng 7 c# lambda currying
我正在阅读Accelerated C#我真的不明白以下代码:
public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> (
this Func<TArg1, TArg2, TResult> func,
TArg2 constant )
{
return (x) => func( x, constant );
}
Run Code Online (Sandbox Code Playgroud)
在最后一行x指的是什么?还有另一个:
public static Func<TArg2, Func<TArg1, TResult>> Bind2nd<TArg1, TArg2, TResult>
( this Func<TArg1, TArg2, TResult> func )
{
return (y) => (x) => func( x, y );
}
Run Code Online (Sandbox Code Playgroud)
我该如何评价这个?(y) => (x) => func( x, y )通过哪里......它确实令人困惑.
Eri*_*ert 19
我们先简化一下代码:
Func<int, int> B(Func<int, int, int> f, int c)
{
return x=>f(x, c);
}
Run Code Online (Sandbox Code Playgroud)
这与以下内容相同:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在很清楚x指的是什么?x是"魔术"功能的参数.
现在你可以像这样使用B:
Func<int, int, int> adder = (a, b)=>a+b;
Func<int, int> addTen = B(adder, 10);
int thirty = addTen(20);
Run Code Online (Sandbox Code Playgroud)
合理?看看这里发生了什么?我们正在使用两个参数的函数并将其中一个参数"固定"为常量.所以它成为一个参数的函数.
第二个例子更进了一步.再次,简化以摆脱困境,以便您可以更容易地理解它:
Func<int, Func<int, int>> B2(Func<int, int, int> f)
{
return y=>x=>f(x,y);
}
Run Code Online (Sandbox Code Playgroud)
这是一样的
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;
}
Run Code Online (Sandbox Code Playgroud)
所以你说
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);
Run Code Online (Sandbox Code Playgroud)
B是参数修复器.B2 为您制作参数修复工具.
然而,这不是点 B2的.B2的重点是:
adder(20, 10);
Run Code Online (Sandbox Code Playgroud)
给出了相同的结果
B2(adder)(20)(10)
Run Code Online (Sandbox Code Playgroud)
B2 将两个参数的一个函数转换为每个参数的两个函数.
合理?