C# 函数式编程:部分应用与局部套用

什么是局部套用?

局部套用可以将需要接收多个参数的函数转化为一个函数链,在这个函数链的末尾,所有的参数都可以使用。

如何在C#当中实现局部套用

我们有一个函数如下:

public int Test(int value,int value2)
{
    return value * value2;
}

public void call()
{
    Func<int,int,int> a = Test;
	int _result = a(10,20);
}

它的局部套用函数如下:

public Func<int,int> Test2(int par2)
{
    return par1=>par1*par2;
}

public void call2()
{
    Func<int,Func<int,int>> a = Test2;
	var _func1 = a(10);
	int _result = _func1(20);
	// or
	a(10)(20);
}

我们可以建立一个扩展函数来直接将一个正常函数转换为一个局部套用函数:

public static Func<T1,Func<T2,TR>> Curry<T1,T2,TR>(this Func<T1,T2,TR> func)
{
    return par1=>par2=>func(par1,par2);
}

也可以将一个局部套用格式的函数转换为正常的方法:

public static Func<T1,T2,TR> UnCurry<T1,T2,TR>(this Func<T1,Func<T2,TR>> func)
{
    return (par1,par2)=>func(par1)(par2);
}

为什么要使用局部套用格式的函数?

最主要的原因是只需要部分计算参数而不是全部参数就可以调用这个函数。该过程就是部分应用,这是一个函数
构建技术。
使用部分应用的另外的一个理由就跟建立重载函数的理由是一样的。