ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
1.在函数式编程当中有一个很重要的概念就是函数组合,实际上就是把处理数据的函数像管道一样连接起来,然后让数据穿过管道得到最终的结果。例如: 2.const add1 = (x) => x + 1; 3.const mul3 = (x) => x \* 3; 4.const div2 = (x) => x / 2; 5.div2(mul3(add1(add1(0)))) //=>3 6. 7.而这样的写法可读性明显太差了。我们可以构建一个 compose 函数,它接受任意多个函数作为参数(这些函数都只接受一个参数),然后 compose 返回的也是一个函数,达到以下的效果: 8.const operate = compose(div2, mul3, add1, add1) 9.operate(0) //=>相当于div2(mul3(add1(add1(0)))) 10.operate(2) //=>相当于div2(mul3(add1(add1(2)))) 11. 12.简而言之:compose 可以把类似于 f(g(h(x))) 这种写法简化成 compose(f, g, h)(x)。请你完成 compose 函数的编写。 13.额外挑战:你能通过 1~2 行代码实现 compose 吗。 ~~~ const add1 = (x) => x + 1; const mul3 = (x) => x * 3; const div2 = (x) => x / 2; //=>把数组拼成字符串,把字符串EVAL了即可 // [div2, mul3, add1, add1] // 'div2(mul3(add1(add1(0))))' // const compose = (...arg) => {//=>不销毁的栈 // //=>arg:[div2, mul3, add1, add1] // return val => { // //=>fn(0):执行的是小函数,val=0 // let str = ''; // arg.forEach(item => (str += item.name + ',')); // str = str.replace(/,/g, '('); // str += val; // arg.forEach(item => (str += ')')); // return eval(str); // } // }; // let fn = compose(div2, mul3, add1, add1); // console.log(fn(0));//=>div2(mul3(add1(add1(0)))) /* * 柯理化函数编程思想 * 1.执行一个方法,传递一些参数进去,首先形成一个不销毁的栈,把传递的这些值存储起来(没有立即使用,属于预先存储一下) * 2.返回一个小函数给栈外面 * 3.当执行返回的小函数时候,把之前第一步预先存储的信息拿过来使用(作用域链、闭包等机制完成的) * * 我们把JS中基于闭包实现的预先存储的思想成为 “柯理化函数思想” */ // const compose = (...arg) => { // //=>arg:[div2, mul3, add1, add1] // arg = arg.reverse();//=>[add1, add1,mul3,div2] // return val => { // //=>val:0 // arg.forEach(item => { // val = item(val); // //第一次 add1(0) =>1 =>val=1 // //第二次 add1(1) =>2 =>val=2 // //第三次 mul3(2) ... // }); // return val; // } // }; // let fn = compose(div2, mul3, add1, add1); // console.log(fn(0));//=>div2(mul3(add1(add1(0)))) ~~~