public static class CurryExtensions
{
public static Func<TArg2, Func<TArg1,TResult> > Bind2nd<TArg1, TArg2, TResult>(
this Func<TArg1, TArg2, TResult> func )
{
return (y) =>(x) => func(x,y ); //这句lambda表达式是什么意思啊
}
}
class Program
{
static void Main(string[] args)
{
var mylist = new List<double> { 1.0, 3.4, 5.4, 6.54 };
var newlist = new List<double>();
Func<double, double, double> func = (x, y) => x + y;
//这里为什么是 func.Bind2nd()(3.2)而不是 func.Bind2nd(3.2)呢?
var funcBound = func.Bind2nd()(3.2);
foreach (var item in mylist)
{
Console.Write("{0} ", item);
newlist.Add(funcBound(item));
}
Console.WriteLine();
foreach (var item in newlist)
{
Console.Write("{0} ", item);
}
Console.WriteLine();
}
}
小弟最近在看lambda感觉好些地方比较的模糊,望高手解答......
function Bind2nd(func) {
function(y) {
return function(x) {
return func(x, y);
}
}
}
Bind2nd(function(x, y) { return x + y; });
返回函数的函数的函数……好像我也说不清楚,感觉上面的写法清晰点
记得linq中也会用到这个,不懂,帮顶。。。
public static Func<TArg2, Func<TArg1,TResult> > Bind2nd<TArg1, TArg2, TResult>(
this Func<TArg1, TArg2, TResult> func )
{
return (y) =>(x) => func(x,y );
}
上面的代码的效果是为 Func<TArg2, Func<TArg1,TResult> > 委托类型定义一个扩展方法(Bind2nd<TArg1, TArg2, TResult>) 。扩展方法是一个特殊的静态方法、既然是方法,那就一定有返回值。Bind2nd 方法的返回值就是一个Func<TArg2, Func<TArg1,TResult> >类型的委托实例、那就可以理解 return (y) =>(x) => func(x,y ); 这句话的意思了,就是返回一个 Func<TArg2, Func<TArg1,TResult> >类型的委托。
再来看 Func<double, double, double> func = (x, y) => x + y; 这句话,这句话的意思是 定义一个 委托实例,实例名为 func 。扩展方法是可以像实例方法一样调用 object.Method(); 那这个也可以:func.Bind2nd(),那调用这个方法返回的结果是什么呢,上面已经说了是返回一个委托实例,那也可以 通过 实例名+(参数) 的方式来调用;
所以 var funcBound = func.Bind2nd()(3.2); 这句话的意思很明白了。实际上可以分解成 var tempFunc=func.Bind2nd(); var funcBound=tempFunc(3.2); 现在来看 tempFunc(3.2);返回的结果是什么呢 ?
Func<TArg2, Func<TArg1,TResult> > 这个委托类型两个参数的意思分别是 TArg2 表示参数 就是 3.2,Func<TArg1,Tresult> 表示返回值。就是tempFunc(3.2)返回的结果。他的结果还是个委托实例,那同样可以类似的调用方式调用:funcBound(item);。
上面这个题目,难点就在于,扩展方法、以及Lambda 表达式的使用了。希望能对你有所帮助。