7

我正在阅读 Accelerated C# 我不太了解以下代码:

public static Func<TArg1, TResult> Bind2nd<TArg1, TArg2, TResult> (
    this Func<TArg1, TArg2, TResult> func,
    TArg2 constant ) 
{
    return (x) => func( x, constant );
}

在最后一行 x 指的是什么?还有另一个:

public static Func<TArg2, Func<TArg1, TResult>> Bind2nd<TArg1, TArg2, TResult>
( this Func<TArg1, TArg2, TResult> func )
{
    return (y) => (x) => func( x, y );
}

我如何评价这个?(y) => (x) => func( x, y )什么在哪里传递......它确实令人困惑。

4

4 回答 4

19

我们先简化一下代码:

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;
}

现在很清楚 x 指的是什么吗?x 是函数“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将两个参数的一个函数变成一个参数的两个函数

有道理?

于 2010-09-02T05:25:04.480 回答
1

x 是 lambda 的参数,它的类型是 TArg1。

将 => 发音为“映射到”可能会有所帮助,就像“x 映射到一个新函数,其中一个 TArg2 类型的常量被替换为原始函数委托 func”。

于 2010-09-02T05:07:50.153 回答
1

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

几个小时的 Scheme 可以帮助你,但试试这个。

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

(x) => func (x, constant)

现在您已将上述内容分配给变量,可以说,您可以通过变量lambda调用该函数lambda

lambda(x);

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

于 2010-09-02T05:09:43.177 回答
1

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

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

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

于 2010-09-02T05:21:16.503 回答