函数柯里化

柯里化函数概念就是将一个多参数的函数 转化为单一参数的函数;

举个栗子

function add(a,b,c){

  return a + b + c;

}

 

现在需要让这个函数能够实现这么调用 add(1)(2)(3)或者add(1,2)(3) 或者add(1,2,3)

使用curry函数对这个函数进行柯里化

1
2
3
4
5
6
7
8
9
10
11
12
13
function curry(func){
    let argLength = func.length; // 获取函数参数的个数
  let curried = (...args) => {
          // 需要把参数凑齐了 才能执行传入的func函数 ,最终要返回  func(...args)
          // 所以当参数不够的时候继续执行柯里化,收集参数
         if(args.length < argLength) {
           // 收集参数
            return (...rest) => curried(...args, ...rest)
         }else {
             // 参数齐了 执行func
              return func(...args)
        }
   }<br>  // 返回这个函数<br>  return curried}<br><br><br>

  

测试: 

1
2
3
let add2 = curry(add)
console.log(add2(1, 2)(3))  // 6
console.log(add2(1)(2)(3))  // 6

  

 

然后我们看到很多地方有箭头函数连续写的

 

例如let func = a => b => c => {return a+b+c}

其实就是一个柯里化的过程,是属于es6的多次柯里化过程

let func2 = a => (b,c) => (de) => { return a + b +c +de}
调用

func(1)(2)(3)

func2(1)(2,3)(4)

但是我们可以将前两次传参存给一个变量, 这样 最后一次我们再传参再决定求值

例如  

let add3 = func(3)

let add4 = add3(1)

现在我们重新定义了两个函数,任何数和add3或者add4相加

add3(3) // 6

add4(4) // 8

所以我们得出以下结论

柯里化函数的功能

  1. 可以惰性求值
  2. 可以提前传递部分参数

 

posted @   大桥默默学  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2017-04-14 animate.css使用
点击右上角即可分享
微信分享提示