函数柯里化(Currying)和合成compose

561 阅读1分钟

1、合成(compose) 如果一个值要经过多个函数,才能变成另外一个值,就可以把所有中间步骤合并成一个函数,叫做‘函数的合成’。 优点:把代码变得简单而富有可读性,同时通过不同的组合方式,我们可以轻易组合出其他常用函数,让我们的代码更具表现力。 将前一个函数的结果作为初始值带入下一个函数中,实现函数的扁平化。

function f1(arg){
    console.log('f1',arg)
    return arg
}
function f2(arg){
    console.log('f2',arg)
    return arg
}
function f3(arg){
    console.log('f3',arg)
    return arg
}

function compose(...funcs){
    if(funcs.length === 0){
        return arg => arg
    }
    if(funcs.length === 1){
        return funcs[0]
    }
    return funcs.reduce((a,b) =>(...args) => a(b(...args)))
}
let res = compose(f1,f2,f3)('omg')

2、柯里化(curry) 把接收多个参数的函数变换成接收一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 就是把一个多参函数,转化为单参函数。 作为一个高阶函数的两个条件: 参数是个函数 返回的也是个函数

// 实现一个柯里化求和函数
function add(x,y){
    return x+y
}
function curry(fn){
    const fn1 = (...args) => {
        // 函数的个数相同
        if(args.length === fn.length)
           return fn(...args)
        // 有多个函数
        return (...arg) => fn1(...args, ...arg)
    }
    return fn1
}

console.log(curry(add)(2)(5)) //7