ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手写函数柯里化

2021-05-02 21:32:38  阅读:190  来源: 互联网

标签:返回 function const 函数 参数 柯里化 手写 接收


手写函数柯里化

柯里化是把接收多个参数的函数转换为成接收单一参数的函数并且返回接收剩余参数的新函数的技术。假如我们需要将一个接收三个参数并返回它们的乘积的函数柯里化:

 1 const multiply = function (a, b, c) {
 2     return a * b * c;
 3 }
 4 
 5 console.log(multiply(1, 2, 3)); // 6
 6 
 7 const multiplyCurried = function (a) {
 8     return function (b) {
 9         return function (c) {
10             return a * b * c;
11         }
12     }
13 }
14 
15 console.log(multiplyCurried(1)(2)(3)); // 6

 

multiply函数接收三个参数并返回这三个参数的乘积,而multiplyCurried函数只接收一个参数,它将返回接收下一个参数的函数,以此类推,直到所需的参数全部被接收完毕,最后一个被返回的函数将完成计算并返回结果。

1 const multiply1 = multiplyCurried(1); //接收第一个参数,等待接收第二个参数
2 const multiply12 = multiply1(2); // 接收第二个参数,等待接收第三个参数
3 const multiply123 = multiply12(3); // 三个参数全部收集完毕,返回计算结果
4 console.log(multiply123); // 6

 

从上面的例子可以看出,函数柯里化的主要作用是参数复用、提前返回和延迟执行。通过柯里化,我们可以固定某个被重复使用的参数为特定值,也可以提前返回接收剩余参数并返回计算结果的函数,并且还能延迟函数的执行直到所需的参数全部收集完毕。

在实现柯里化时,我们可以采用类似于深度优先搜索的策略:当参数没有收集完成时,我们需要在上一个被返回的函数内部继续返回接收剩余参数的函数。当函数所需的参数数量大于已经收集到的参数数量时,这意味着我们需要返回接收剩余所需参数的函数。如果已经收集到的参数数量不小于所需的参数数量,此时应该返回计算结果。

 1 const currifying = function (fn) {
 2     if (typeof fn !== "function") {
 3         throw new TypeError("The target of currifying must be a function");
 4     }
 5 
 6     return function curriedFunction(...args) {
 7         // 当参数收集完毕,返回计算结果
 8         if (args.length >= fn.length) {
 9             return fn.apply(null, args);
10         } else {
11             // 继续收集剩余的参数
12             return function (arg) {
13                 return curriedFunction(...args, arg); // 在上一级被返回的函数内部返回接收剩余参数的函数
14             }
15         }
16     }
17 }
18 
19 const f0 = currifying(multiply);
20 const f1 = f0(1);
21 const f2 = f1(2);
22 const f3 = f2(3);
23 console.log(f3); // 6

 

标签:返回,function,const,函数,参数,柯里化,手写,接收
来源: https://www.cnblogs.com/ccpeng/p/14726507.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有