vlambda博客
学习文章列表

使用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))的效果