函数柯里化

2022-05-27  本文已影响0人  Spinach

柯里化(currying)。
柯里化通常也称为部分求值,其含义是给函数分步传递参数,将每次传递的参数进行处理并返回一个更具体的函数接收剩下的参数,这中间可嵌套多层这样的接收部分参数,直至返回最后结果。
其实就是一种函数的转换,可将一个函数从可调用的\color{red}{f(a, b, c) } 转换为可调用的 \color{red}{f(a)(b)(c)}。可以实现\color{red}{固定函数的部分参数}

案例一:实现以下求和

currying(sumFn)(1)(2)(3)();//6
currying(sumFn)(1,2)(3,4)(5)();//15
currying(sumFn)(1)(2,3,4,5)(6)();//21

//函数柯里化编程题
//求和函数
const sumFn =(...args)=>{
  return args.reduce((a,b)=>{
    return a+b;
  })
};

//柯里化
var currying = function(func){
  const args=[];
  return function result(...rest){
    if(rest.length === 0){
      return func(...args);
    }else{
      args.push(...rest);
      return result;
    }
  } 
}
currying(sumFn)(1)(2)(3)();//6
currying(sumFn)(1,2)(3,4)(5)();//15
currying(sumFn)(1)(2,3,4,5)(6)();//21

扩展:排序(升序)

//排序(升序)
const sortFn = (...args)=>{
  return args.sort((a,b)=>a-b)
}
currying(sortFn)(5)(3)(6,4)(1)(2)(7)();//1,2,3,4,5,6,7

案例一视频详细讲解

案例二

一个多参数的普通函数:

function curry(x, y){
    return x + y
}
 
plus(1, 2) // 3

经过柯里化之后的函数:

function curry(y){
    return function (x){
        return x + y
    }
}
 
plus(1)(2) // 3

\color{red}{实现固定函数的部分参数:}
例:假设当前需要根据人员的不同打印:我是 XX 公司 XX 部门的XX,XX 岁
正常:

function print(company, department, name, age) {
    console.log(`我是 ${company} ${department} 部门的 ${name},${age} 岁`);
}
print('ali', 'F77', '张三', 26);//我是 ali 公司'F77 部门的张三,26岁
print('ali', 'F77', '李四', 30);//我是 ali 公司'F77 部门的李四,26岁

可以发现,两次调用的“公司”和“部门”都是一样的,就没必要都作为参数传递,除了进行最简单的固定字符的字符串拼接,还可以写作:

function curry(company, department) { //接收固定的公司、部门
  return function (name, age) {
    console.log(`我是 ${company} ${department} 部门的 ${name},${age} 岁`);
  }
}
let print = curry('ali', 'F77'); // 传递固定的公司、部门
 
print('张三', 26);//调用 return 出来的函数并传变化的参数
print('李四', 30);
//参数全部传递后才会打印结果

所以,柯里化函数的作用:\color{red}{如果方法中固定了某些参数,可以得到接收余下参数的一个函数}
也就是说,柯里化函数调用后,得到的是一个函数。柯里化可以帮助我们把相同的参数固定下来,把任意的多参函数通过固定参数的方式,变为单参函数,这样就不用每次调用函数的时候都去反复传递这些一样的参数了。
这篇文章介绍的很详细
案例二参考

上一篇下一篇

猜你喜欢

热点阅读