使用C#体验函数式编程之——Partial application(局部应用)

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C#体验函数式编程之——Partial application(局部应用)相关的知识,希望对你有一定的参考价值。

函数式编程

函数式编程是一种编程范式,着力于避免共享状态、可变数据和副作用产生,函数是第一等公民。

这与面向对象编程相反,在面向对象编程中,应用程序状态通常与对象中的方法共享和共存。

函数式编程是声明式的而不是命令式的,应用程序状态通过纯函数流动。

纯函数就是一个函数,并且这个函数有两种特性:

  • 函数的返回值只和给的参数有关,不随时间的变化而变化

  • 函数执行时无任何副作用

Partial Application

Partial Application是函数式编程中一个很常见的模式,它通过固定一个函数的部分参数,产生一个参数较少的函数。

例如有一个函数f(a, b, c), 我们可以传入参数ab, 使得函数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“,记住我!

以上是关于使用C#体验函数式编程之——Partial application(局部应用)的主要内容,如果未能解决你的问题,请参考以下文章

使用C#体验函数式编程之——Currying(柯里化)

C#函数式编程之缓存技术

C#函数式编程中的递归调用之尾递归详解

偏函数-functools.partial

Java 帝国之函数式编程(下)

C#基础知识之Partial