javascript函数式编程之 函数组合(compose)

定义

在函数式编程使用过程中,组合(compose)简单来说就是把两个你喜欢的接入参数一样(最好都是一参的形式,可能过柯里化curry把多参转为一参)的函数把它们组合到一起,产生一个新的函数。如下:

var compose = function(f, g) {
  return function(x) {
    return f(g(x));
  };
};

在这里,我们把fg两个函数组合到一起,它们有共同的参数x,显然在compose组合时,函数的执行顺序是由右向左执行,先执行g(x)再执行f(g),可称之为“左倾”。使用起来如下:

// 使用组合
var toUpperCase = function(str) { return str.toUpperCase(); };
var reverse = function(str) { return str.split('').reverse().join(''); };
var toUpperCaseAndReverse = compose(reverse, toUpperCase); // toUpperCaseAndReverse由右向左,先执行toUpperCase,再执行reverse
toUpperCaseAndReverse("abcd"); // => "DCBA"

// 不使用组合
var toUpperCaseAndReverse = function(x){ return reverse(toUpperCase(x));};

代码组合的好处

代码组合的好处是可以大大的提高程序的可读性,比一大堆函数嵌套调用更加简单明了。
从右向左执行更加能够反映数学上的含义。函数式编程的目的和意义是为了让编码与数学函数更加相似,若能更好地贴近数学公式就完美了。

// 结合律(associativity)
var associative = compose(f, compose(g, h)) == compose(compose(f, g), h);
// true

这个特性就是数学意义上的结合律,符合结合律意味着不管你是把 g 和 h 分到一组,还是把 f 和 g 分到一组都不重要。

参考引用自:JS函数式编程指南

作者: 博主

Talk is cheap, show me the code!

发表评论

邮箱地址不会被公开。

Captcha Code