C# 需要帮助了解lambda(咖喱)

C# 需要帮助了解lambda(咖喱),c#,lambda,currying,C#,Lambda,Currying,我正在阅读加速C#我不太理解以下代码: public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> ( this Func<TArg1, TArg2, TResult> func, TArg2 constant ) { return (x) => func( x, constant ); } 公共静态函数Bind2nd( 这个Func Func, TArg

我正在阅读加速C#我不太理解以下代码:

public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> (
    this Func<TArg1, TArg2, TResult> func,
    TArg2 constant ) 
{
    return (x) => func( x, constant );
}
公共静态函数Bind2nd(
这个Func Func,
TArg2常数)
{
返回(x)=>func(x,常数);
}
在最后一行中,x指的是什么?还有一个:

public static Func<TArg2, Func<TArg1, TResult>> Bind2nd<TArg1, TArg2, TResult>
( this Func<TArg1, TArg2, TResult> func )
{
    return (y) => (x) => func( x, y );
}
公共静态函数Bind2nd
(本职能)
{
返回(y)=>(x)=>func(x,y);
}

我如何评价这一点<代码>(y)=>(x)=>func(x,y)在哪里传递什么。。。它确实令人困惑。

x是lambda的参数,类型为TArg1


将=>发音为“maps to”可能会有帮助,因为在“x映射到一个新函数时,原始函数委托func中替换了一个类型为TArg2的常数。”

变量x是一个未绑定的变量。表示调用
Bind2nd
返回函数的参数

使用Scheme几个小时会对您有所帮助,但请尝试一下

调用
Bind2nd
时,返回的结果是一个函数。该函数定义为

(x) => func (x, constant)
现在您已经将上述内容分配给了一个变量,比如说
lambda
,您可以通过
lambda
变量调用该函数

lambda(x);

Bind2nd
中定义的
x
只是一个变量,表示将返回给您的函数的参数。

lambda表达式是匿名方法的缩写。与匿名方法一样,lambda表达式被分配给委托类型。适用于匿名方法的所有条件也适用于lambda表达式

=>称为lambda运算符,读作“转到”。运算符的左侧指定由逗号分隔的输入参数,右侧指定称为lambda body的表达式或语句块。(p1,p2,p3,…pN)=>表达式如果只有一个参数,则可以跳过括号p1=>表达式


我在这里写了一个小博客解释lambda表达式

让我们首先简化代码:

Func<int, int> B(Func<int, int, int> f, int c)
{
    return x=>f(x, c);
}
给出与相同的结果

B2(adder)(20)(10)
B2将两个参数中的一个函数转换为每个参数中的两个函数


有意义吗?

我必须感谢您的详细解释。现在连我都明白了:)
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);
adder(20, 10);
B2(adder)(20)(10)