2010-09-02 24 views
7

我读加速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)什么传递在哪里......它令人困惑。

回答

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 匝的两个参数一个功能为一个参数的每个的两个功能。

有意义吗?

+0

我必须说谢谢你的详细解释。现在我甚至都明白了:) – Riaan 2010-09-02 09:19:13

1

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

将=>描述为“映射到”是有帮助的,如在“x映射到具有类型为TArg2的常量替换为原函数委托函数func的新函数中”。

+0

只是一个添加,MSDN说阅读'=>'为*去*。 – 2010-09-02 06:13:12

1

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

几个小时与计划将帮助你在这里,但试试这个。

当您拨打Bind2nd时,返回的结果是一个函数。该函数定义为

(x) => func (x, constant) 

现在你有以上分配给一个变量,可以说lambda,您可以通过lambda变量

lambda(x); 

xBind2nd定义只是调用该函数一个表示函数参数的变量,将返回给您。

1

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

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

我已经写了一个小博客说明这里的lambda表达式Lambda Expression