使用C#体验函数式编程之——Currying(柯里化)
前言
上次,我们尝试了函数式编程中。
Partial Application是函数式编程中一个很常见的模式,它通过固定一个函数的部分参数,产生一个参数较少的函数。
今天,我们再来体验函数式编程另外一种模式,Currying(柯里化)。
Currying
Currying是将具有多个参数的函数拆分为一个参数函数的嵌套链的过程。因此,柯里化函数是一个函数,它一次接受一个参数,在每一步都返回一个新函数。
例如有一个函数f(a, b, c)
, 我们可以传入参数a生成函数f_a
,再传入参数b生成函数f_ab
,最后传入参数c执行函数。
调用同一个函数,并且传递的参数绝大多数都是相同的,那么使用Currying处理过的函数,则是一个很好的选择。
那么,用C#怎么实现呢?
Demo
和上次一样,我们引用nuget包Curryfy
。
通过将Curry扩展方法用于Func委托实现Currying。示例代码如下:
using static Curryfy.CurryExtensions;
Func<int, int, int, int> add = (a, b, c) => a + b + c;
var addCurried = add.Curry();
var add1 = addCurried(1);
var add4 = add1(3);
var result = add4(5);
Console.WriteLine(result);
//9
结论
Partial application和Currying的功能感觉有点相似,但是使用场景不同:
-
Partial application 主要用于减少参数输入,实现默认参数 -
Currying 主要用于函数组合,每次只接受一个参数,实现f(g(x))的效果