js函数柯里化

// 在计算机科学中,柯里化(Currying)是把
// 接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,
// 并且返回接受余下的参数且返回结果的新函数的技术。例如:
// sum = curry(function(a,b,c){
//     return a+b+c
// })
// sum(1,2,3)
// sum(1,2)(3)
// sum(1)(2)(3)
// sum(1,2)(3)          参数达到时返回结果,否则接受剩余参数

// 单一功能的实验测试学习 例如
// func(1,2,3) 6
// func(1,2)(3) 6
// func(1)(2)(3) 6
// func(1,2)(3) 6

// 对单一功能的实验 版本1
// 返回结果 func(1,2,3) 6
// 但 func(1)(2) 错误
// 根据柯里化说明,最终应该返回接受余下的参数且返回结果的新函数
function func(...args) {
    let sum = 0
    for (let i of args) {
        sum += i
    }
    return sum
}

// 对单一功能的实验 版本2
// func(1)(2) 3
// func(1)(2) 6 错误
// 值应该被初始化
function func(...args) {
    func.sum = func.sum === void 0 ? 0 : func.sum
    for (let i of args) {
        func.sum += i
    }
    return func
}

// 对单一功能的实验 版本3
// 单一功能通过
function func(...args) {
    let sum = 0
    function f(...args) {
        for (let i of args) {
            sum += i
        }
        return f
    }
    f.sumOf = () => {
        return sum
    }
    return f(...args)
}

// 去除单一功能后从而推柯里简化版
// 并且应该对传入函数进行转换所以要接受一个函数
function curry(fn) {
    function f(...args) {
        return f
    }
    return f
}

// 重点····柯里化是对一个函数进行转换,要返回转换过后的函数
// 重点当函数参数达到数量时返回结果,否则返回一个接受剩余参数的函数
// 柯里化版本
function curry(fn) {
    function f(...args) {
        return args.length === fn.length
            ? fn(...args)
            : (...arg) => f(...args, ...arg)
    }
    return f
}

sum = curry((a, b, c) => {
    return a + b + c
})
sum(1)(2)(3)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值