作家
登录

JS中的柯里化及精巧的自动柯里化实现

作者: 来源: 2017-12-11 16:20:34 阅读 我要评论

先上代码:

  1. // ES5 
  2. function curry(fn) { 
  3.   function _c(restNum, argsList) { 
  4.     return restNum === 0 ? 
  5.       fn.apply(null, argsList) : 
  6.       function(x) { 
  7.         return _c(restNum - 1, argsList.concat(x)); 
  8.       }; 
  9.   } 
  10.   return _c(fn.length, []); 
  11.  
  12. // ES6 
  13. const curry = fn => { 
  14.   const _c = (restNum, argsList) => restNum === 0 ? 
  15.     fn(...argsList) : x => _c(restNum - 1, [...argsList, x]); 
  16.  
  17.   return _c(fn.length, []); 
  18.  
  19. /***************** 应用 *********************/ 
  20.  
  21. var plus = curry(function(a, b) { 
  22.   return a + b; 
  23. }); 
  24.  
  25. // ES6 
  26. const plus = curry((a, b) => a + b); 
  27.  
  28. plus(2)(4); // => 6 

如许就实现了主动的柯里化!(╭ ̄3 ̄)╭♡

如不雅你看得懂产生了什么的话,那么恭喜你!大年夜家口中的大年夜佬就是你!╰(°▽°)╯,快留下赞然后去开端你的函数式生活吧(滑稽

如不雅你没看懂产生了什么,别担心,我如今开端帮你理一下思路。

需求分析

我们须要一个 curry 函数,它接收一个待柯里化的函数为参数,返回一个用于接收一个参数的函数,接收到的参数放到一个列表中,当参数数量足够时,履行原函数并返回结不雅。

实现方法

总的设法主意就是每传一次参,就把该参数放入一个参数列表 argsList 中,如不雅已经没有要传的参数了,那么就调用fn.apply(null, argsList)将原函数履行。要实现这点,我们就须要一个内部的断定函数 _c(restNum, argsList),函数接收两个参数,一个是残剩参数个数 restNum,另一个是已获取的参数的列表 argsList_c 的功能就是断定是否还有未传入的参数,当 restNum 为零时,就是时刻经由过程fn.apply(null, argsList)履行原函数并返回结不雅了。如不雅还有参数须要传递的话,也就是说 restNum 不为零时,就须要返回一个单参数函数

  1. function(x) { 
  2.   return _c(restNum - 1, argsList.concat(x)); 

来持续接收参数。这里形成了一个尾递归,函数接收了一个参数后,残剩须要参数数量 restNum 减一,并将新参数 x 参加 argsList 后传入 _c 进行递归调用。结不雅就是,当参数数量不足时,返回负责接收新参数的单参数函数,当参数够了时,就调用原函数并返回。

如今再来看:

  1. function curry(fn) { 
  2.   function _c(restNum, argsList) { 
  3.     return restNum === 0 ? 
  4.       fn.apply(

      推荐阅读

      人脸识别难用!苹果拿下屏下指纹 新iPhone爽了

    开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散至少大年夜今朝的体验上来看,大年夜家更迎接屏下指纹而不是人脸辨认,毕竟新技巧过度须要一步步来.... 指纹辨认真的要彻底被手机摈>>>详细阅读


    本文标题:JS中的柯里化及精巧的自动柯里化实现

    地址:http://www.17bianji.com/lsqh/39665.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)