首页 > 其他 > 详细

手写函数柯里化

时间:2021-05-03 00:15:00      阅读:35      评论:0      收藏:0      [点我收藏+]

手写函数柯里化

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

 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

 

手写函数柯里化

原文:https://www.cnblogs.com/ccpeng/p/14726507.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!