javascript中的函数柯里化

1 介绍

        函数柯里化(Currying)是一种在计算机科学中常见的技术,特别是在函数式编程中广泛应用。它的核心思想是将接受多个参数的函数,转换为接受单个参数的函数链式调用。这意味着,原本的多参数函数可以通过一系列单参数函数的调用来实现。

        如下所示接收两个参数的求和函数,以及柯里化后的求和函数:

function sum(a, b){
    return a + b
}
console.log(sum(4, 4))

// curring funciton
function csum(a){
    return (b) => {
        return a + b
    }
}
console.log(csum(2)(5))

// more parameters
function mcsum(a){
   return (b) => {
    return (c) => {
        return a + b + c
    }
   } 
}
const res = mcsum(1)(2)(3)
console.log(res)

2 函数柯里化的优化

        优化柯里化函数,使其能够在一次调用或者多次调用中不仅仅传入一个参数,可以传入任意参数,只要传递参数满足要求后执行求和,如下所示(存在副作用):

// optimize the curring function, sum(1)(2,3)(3,4,5)
// side effect
const num = []
function sum(...args){
    num.push(...args)
    if(num.length >= 5){
        return num.slice(0, 5).reduce((p, v) => {return p + v}, 0)
    }
    return sum
}

const res = sum(1)(2, 3)(4, 5)
console.log(res)

3 函数柯里化的继续优化

        2中的柯里化函数存在副作用,使用函数闭包创建一个maker函数隐层num且可以定制求和的参数数量,如下所示:

function sumMaker(length){
    let num = []
    function sum(...args){
        num.push(...args)
        if(num.length >= length){
            const res = num.slice(0, length).reduce((p, v) => {return p + v}, 0)
            num = []
            return res
        }
        return sum
    }
    return sum
}

const sum3 = sumMaker(3)
console.log(sum3(1, 2)(3, 4))

4 函数柯里化的简单应用

        如下所示,我们可以用柯里化maker批量创建判断类型的函数:

// apllication example (axios)
// function isTypeMaker(type){
//     return (val) =>{
//         return typeof val === type ? true : false
//     }
// }

// siple example 
const isTypeMaker = type => val => typeof val === type ? true : false

const isUndefined = isTypeMaker("undefined")
const isFunction = isTypeMaker("function")
const isNumber = isTypeMaker("number")

console.log(isUndefined(undefined))
console.log(isFunction(1))
console.log(isNumber(10))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值