# 函数组合包含在函数式编程范畴中,就是一种将已被分解的简单任务组合成复杂任务的过程

# 什么是组合

function compose(f, g){
    return function(x) {
        return  f(g(x))
    }
}
// compose(f,g)(x) === f(g(x))
// compose(f,g,m)(x) === f(g(m(x)))
// compose(f,g,m)(x) === f(g(m(x)))
// compose(f,g,m,n)(x) === f(g(m(n(x))))
//···

compose函数,接受若干个函数作为参数;每个函数执行后的输出作为下一个函数的输入;直到最后一个函数执行完毕

# 应用compose函数

假如一个需求,对一个字符串转换为 四舍五入 的数字。

  • 常规实现
let n = '3.56';
let data = parseFloat(n);
let result = Math.round(data); // =>4 最终结果
  • compose实现
let n = '3.56';
let number = compose(Math.round,parseFloat);
let result = number(n); // =>4 最终结果

这个组合的过程就是函数式组合!我们将两个函数组合一起便能构造出新的函数

# 实现组合

概括来说,就是接收若干个函数作为参数,返回一个新函数。新函数执行时,按照 由右向左 的顺序依次执行传入compose中的函数,每个函数的执行结果作为为下一个函数的输入,直至最后一个函数的输出作为最终的输出结果

function compose(...fns){
    return function(x){
        return fns.reduceRight(function(arg,fn){
            return fn(arg);
        },x)
    }
}
接受的参数是不确定的,是一个数组,然后由右向左执行函数

# 实现管道

从左至右处理数据流的过程称之为管道(pipeline)!
即管道的执行顺序是由左向右

function pipe(...fns){
    return function(x){
        return fns.reduce(function(arg,fn){
            return fn(arg);
        },x)
    }
}

参考链接:彻底弄懂函数组合 (opens new window)

Last Updated: 11/22/2019, 5:09:45 PM