柯里化是干什么的?首先看看下面这个函数
let store = (a,b,c) => "这是你的七仔面" //函数就好像一个小卖部,一碗七仔面要三张软妹币:a,b,c (五个参数)
那函数柯里化是什么?就是我们买面吃的过程可能是这样:
let curryStore = curry(store) //刚刚的小卖部被柯里化了 //最佳状况 curryStore(1,5,1)// 老板,刚好!不用找了,刚好七块钱。老板: "这是你的七仔面" //偶尔出现的情况 let boss = curryStore(5) //老板,这五块钱你先拿着,我找找有没有一块钱。老板:…… boss = boss(1) //有了老板,这一块钱你先拿着,我找找还有没有一块钱。。老板:…… boss(1) //哈哈,终于找到了,给!老板:"这是你的七仔面" curryStore(5)(1)(1) //等价于上诉情况
所以这里我们可以看到,函数柯里化,是可以用来慢慢凑齐参数,延迟函数的执行。(先分期交钱,后交货!)
做个题
现在,我们的目标是实现一个curry 函数,达到以下使用效果:
在给到足够的参数时,执行函数。不够参数的时候则返回一个新的curry函数。
let curryPlus = curry((a,b,c) => a+b+c) //这里给到一个有三个参数的函数 curryPlus(1)(2)(3) //返回 6 curryPlus(1)(2,3) //返回 6 curryPlus(1,2)(3) //返回 6 let x = curryPlus(1)(2) //喂,怎么才两个参数?返回一个curry函数(已经带了两个参数) x(1) //返回 4 x(2) //返回 5
作为一个js很厉害的人,这种问题用一行代码解决不是问题,问题是我没那么厉害。。。
于是,我们先从土方法说起吧orz
按照curry的用法,原理是返回了一个函数,这个函数的参数个数不确定(你可能同时掏出两张一块钱),于是我们可以运用不定参数的写法:
const curry = (fn) => { return (...args) =>{ //不定参数,想给多少给多少 //给钱交货环节 } }
柯里化函数需要记住你已经给过他的参数,如果没给的话,则默认为一个空数组:
const curry = (fn,arr=[]) => { //arr数组用于记录已有参数 return (...args) =>{ //给钱交货环节 } }
接下来每次调用的时候,需要检查参数是否给够,如果够了,则执行fn,没有的话则返回一个新的curry函数,将现有的参数塞给他:
const curry = ( fn, arr = []) => { return (...args) => { //判断参数总数是否和fn参数个数相等 if([...arr, ...args].length === fn.length){ return fn(...arr, ...args) //拓展参数,调用fn }else{ return curry(fn,[...arr, ...args]) //迭代,传入现有的所有参数 } } }
到这里,其实我们已经实现了curry函数。
接下来就是要看看怎么写才能更简洁。
首先,中间的代码可以写成一个立即执行函数,省掉一些...arr, ...args:
const curry = ( fn, arr = []) => { return (...args) => { return ( a => { //a是一个数组 if(a.length === fn.length) { return fn(...a) }else{ return curry(fn, a) } })([...arr, ...args]) //这里把arr和args摊开成一个数组赋值给a } }
if语句可以缩减成三元表达式,也可以省掉很多字啦:
const curry = ( fn, arr = []) => { return (...args) => { return ( a => { return a.length === fn.length "htmlcode">const curry = ( fn, arr = []) => { return (...args) => { return ( a => a.length === fn.length"htmlcode">const curry = ( fn, arr = []) => { return (...args) => ( a => a.length === fn.length"htmlcode">const curry = ( fn, arr = []) => (...args) => ( a => a.length === fn.length"htmlcode">const curry = ( fn, arr = []) => (...args) => ( a => a.length === fn.length"htmlcode">const curry = ( fn, arr = []) => (...args) => ( (a,b) => b.length === 0? fn(...a) : curry(fn, a))([...arr, ...args],[...args]) let curryPlus = curry((...x)=>x.reduce((a,b)=>a+b)) curryPlus(1) //返回一个函数 curryPlus(1)(2) //返回一个函数 //遇到参数个数为0的情况才执行 curryPlus(1)(2)(4)() //返回7 curryPlus(1,2)(4)() //返回7以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!华山资源网 Design By www.eoogi.com暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 黄乙玲1988-无稳定的爱心肝乱糟糟[日本东芝1M版][WAV+CUE]
- 群星《我们的歌第六季 第3期》[320K/MP3][70.68MB]
- 群星《我们的歌第六季 第3期》[FLAC/分轨][369.48MB]
- 群星《燃!沙排少女 影视原声带》[320K/MP3][175.61MB]
- 乱斗海盗瞎6胜卡组推荐一览 深暗领域乱斗海盗瞎卡组分享
- 炉石传说乱斗6胜卡组分享一览 深暗领域乱斗6胜卡组代码推荐
- 炉石传说乱斗本周卡组合集 乱斗模式卡组最新推荐
- 佟妍.2015-七窍玲珑心【万马旦】【WAV+CUE】
- 叶振棠陈晓慧.1986-龙的心·俘虏你(2006复黑限量版)【永恒】【WAV+CUE】
- 陈慧琳.1998-爱我不爱(国)【福茂】【WAV+CUE】
- 咪咕快游豪礼放送,百元京东卡、海量欢乐豆就在咪咕咪粉节!
- 双11百吋大屏焕新“热”,海信AI画质电视成最大赢家
- 海信电视E8N Ultra:真正的百吋,不止是大!
- 曾庆瑜1990-曾庆瑜历年精选[派森][WAV+CUE]
- 叶玉卿1999-深情之选[飞图][WAV+CUE]