柯里化(局部套用)定义:是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。
public static class A
{
public static Func<T1, Func<T2, TResult>> Currying<T1, T2, TResult>(this Func<T1, T2, TResult> func) => x1 => x2 => func(x1, x2);
public static Func<T1, Func<T2, Func<T3, TResult>>> Currying<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func) => x1 => x2 => x3 => func(x1, x2, x3);
public static Func<T1, Func<T2, Func<T3, Func<T4, Func<T5, Func<T6, TResult>>>>>> Currying<T1, T2, T3, T4, T5, T6, TResult>(this Func<T1, T2, T3, T4, T5, T6, TResult> func) => x1 => x2 => x3 => x4 => x5 => x6 => func(x1, x2, x3, x4, x5, x6);
public static void Test()
{
Func<int, Func<int, int>> a2 = x1 => x2 => x1 + x2;
Func<int, int, int> b2 = (x1, x2) => x1 + x2;
int a2Result = a2(1)(2);
int b2Result = b2.Currying()(1)(2);
Func<int, Func<int, Func<int, int>>> a3 = x1 => x2 => x3 => x1 + x2 + x3;
Func<int, int, int, int> b3 = (x1, x2, x3) => x1 + x2 + x3;
int a3Result = a3(1)(2)(3);
int b3Result = b3.Currying()(1)(2)(3);
Func<int, Func<int, Func<int, Func<int, Func<int, Func<int, int>>>>>> a6 = x1 => x2 => x3 => x4 => x5 => x6 => x1 + x2 + x3 + x4 + x5 + x6;
Func<int, int, int, int, int, int, int> b6 = (x1, x2, x3, x4, x5, x6) => x1 + x2 + x3 + x4 + x5 + x6;
int a6Result = a6(1)(2)(3)(4)(5)(6);
int b6Result = b6.Currying()(1)(2)(3)(4)(5)(6);
}
}
参考文章:
C#函数式编程