关于柯里化和组合函数的实现

131 阅读1分钟
// 柯里化,函数参数够就执行,不够的话返回接收剩下参数的函数
const curry = (fn, ...args) => fn.length > args.length ? (...args2) => curry(fn, ...args, ...args2) : fn(...args)

function add(a,b,c,d){
    return a + b + c + d
}

const curryAdd = curry(add)

console.log(curryAdd(1,2,3,4)) // 10 
console.log(curryAdd(1)(2,3,4)) // 10 
console.log(curryAdd(1,2)(3,4)) // 10 
console.log(curryAdd(1,2,3)(4)) // 10 
console.log(curryAdd(1)(2,3)(4)) // 10 
console.log(curryAdd(1)(2)(3)(4)) // 10 

// 防止洋葱嵌套,将嵌套的函数变为数组。前函数的输出作为后函数的输入
const flow = (...fns) => {
    return function(...value){
        return fns.reduce((result, fn, index) => {
            if(index === 0){
                return fn(...result)
            }
            else{
                return fn(result)
            }
        }, value)
    }
}

function plus(a,b,c,d){
    return a + b + c + d
}

function square(n){
    return n * n
}

const plusAndSquare = flow(plus, square, square)

console.log(plusAndSquare(1,2,3,4)) // 10000