// 在计算机科学中,柯里化(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)