函数式编程
函数式编程是一种编程范式,着力于避免共享状态、可变数据和副作用产生,函数是第一等公民。
这与面向对象编程相反,在面向对象编程中,应用程序状态通常与对象中的方法共享和共存。
函数式编程是声明式的而不是命令式的,应用程序状态通过纯函数流动。
纯函数就是一个函数,并且这个函数有两种特性:
函数的返回值只和给的参数有关,不随时间的变化而变化
函数执行时无任何副作用
Partial Application
Partial Application是函数式编程中一个很常见的模式,它通过固定一个函数的部分参数,产生一个参数较少的函数。
例如有一个函数f(a, b, c)
, 我们可以传入参数a
和b
, 使得函数f
返回一个输入参数为c
的函数。
这样的好处在于,简化输入,屏蔽对部分参数的赋值逻辑。
C#实现
在C#里面Func没法通过只传递一个参数的方式来生成一个新的函数,在C#中声明一个三个参数的函数,调用的时候也没法只传入一个参数。
只能通过定义多个Func的方式实现,类似下面代码:
Func<int, int, int, int> add = (a, b, c) => a + b + c;
Func<int, int> add12 = (c) => add(1,2,c);
Console.WriteLine(add(1,2,3));
Console.WriteLine(add12(3));
这样的定义非常不灵活,如果函数参数过多,最后的实现想想都很壮观:
Curryfy
通过引用nuget包Curryfy
,可以很容易地实现Partial Application:
using static Curryfy.PartialIncrementalFuncExtensions;
var add12 = add.ApplyPartial(1, 2);
Console.WriteLine(add12(3));
Partial Application的优势在于,可以传递任意位置的参数来生成一个新的函数,例如:
using static Curryfy.PartialSubsetFuncExtensions;
var add2 = add.ApplyPartial(arg1: 2);//设置第二个参数
Console.WriteLine(add2(1, 3));
或者按照参数位置传递,例如:
using static Curryfy.PartialDiscardFuncExtensions;
using static Curryfy.Discard;
var add3 = add.ApplyPartial(_, _, 3);
Console.WriteLine(add3(1, 2));
结论
如果你经常使用默认参数,Partial Application无疑是一种更简单的实现方式。
如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“,记住我!