当前位置:网站首页>为什么我要说:柯里化 == 闭包+递归?
为什么我要说:柯里化 == 闭包+递归?
2022-08-07 08:45:00 【InfoQ】
function sum(a,b){
console.log(a+b)
}
sum(1,2)
function sum(a,b,c){
console.log(a+b+c)
}
sum(1,2,3)
- 什么是“开闭原则”?即:我们编程中要尽可能的避免直接修改函数、类或模块,而是要在原有基础上拓展它;
- 什么是“单一职责原则”?即:每个函数、类或模块,应该只负责一个单一的功能;
// 负责两数相加
function sum2(a,b){
console.log(a+b)
}
// 负责三数相加
function sum3(a,b,c){
console.log(a+b+c)
}
// 负责“加法”,
function addCurry(){
...
...
...
}
addCurry(1)(2) // 两数相加
addCurry(1)(2)(3) // 三数相加
...
addCurry(1)(2)(3)...(n) // n 数相加
function directHandle(a,b){
console.log("直接处理",a,b)
}
directHandle(111,222)
// 直接处理 111 222
function delayHandle(a){
return function(b){
console.log("延迟处理",a,b)
}
}
delayHandle(111)
// ƒ (b){
// console.log("延迟处理",a,b)
// }
delayHandle(111)directHandle(111,222)f(b)delayHandle(111)(222)// 两数相加
function addCurry(a){
return function(b){
console.log(a+b)
}
}
addCurry(1)(2)
// 三数相加
function addCurry(a){
return function(b){
return function(c){
console.log(a+b+c)
}
}
}
addCurry(1)(2)(3)
return function
let arr = []
function addCurry() {
let arg = Array.prototype.slice.call(arguments); // 递归获取后续参数
arr = arr.concat(arg);
if (arg.length === 0) { // 如果参数为空,则判断递归结束
return arr.reduce((a,b)=>{return a+b}) // 求和
} else {
return addCurry;
}
}
addCurry(1)(2)(3)()
compose(fn1)(fn2)(fn3)…(fnN)(args)边栏推荐
- LeetCode #94.二叉树的中序遍历
- 随笔-那些快乐的日子
- 选择排序(简单选择排序和堆排序)
- 力拓信创生态,博睿数据多款产品获得东方通与达梦数据库产品兼容互认证明
- Jenkins configures automatic packaging
- 重磅直播 | ORB-SLAM3系列代码讲解:关键帧 专题一
- Spark SQL深入分析之图解五种Join策略的执行流程与应用场景
- Lexicon: 416. Divide Equals and Subsets
- Unity 3D 游戏通用系统设置页面,自定义按键设置,背景虚化,图像设置,亮度对比度饱和度音量调节,分辨率窗口化,帧率垂直同步,抗锯齿,阴影质量,纹理质量设置
- The PG function generates the corresponding table creation statement according to the table name
猜你喜欢

Scala——While和do..While循环控制

jenkins配置自动打包

redis的原理和源码-redis各数据类型的编码格式和数据结构SDS、list、dict、zskiplist、intset、ziplist、quicklist、listpack、rax、stream

Routing, network, Internet, Internet, public network private network IP, NAT technology

基于miniprogram-ci的微信小程序的CI以及接入钉钉通知

5.PHPwhile,foreach和for循环

JVM:(五)运行时数据区之虚拟机栈

一文读懂微服务架构的分解设计

The fifth bullet of FPGA development: hand rubbing breathing light code

Today's thoughts
随机推荐
The fifth bullet of FPGA development: hand rubbing breathing light code
微服务系列一:微服务的优势与劣势
STM32出现波特率不对问题,我们要设定的波特率是9600,而实际的波特率竟然是14400,这是为什么呢?
redis的原理和源码-redis的内存淘汰策略&LRU源码解析&LFU源码解析
当一个用户登录时,会引发哪些安全性的思考呢
redis的原理和源码-基本介绍
【NPM使用相关】NPM 源设置
选择排序(简单选择排序和堆排序)
6.PHP函数、$GET和$POST变量
day2-机器学习-聚类
The second bullet of FPGA development: running water lamp experiment
Heavy Live | ORB-SLAM3 Series Code Explanation: Key Frames Topic 1
关于在物联网公司实习这几天的收获
微服务系列二:微服务架构面临的挑战
redis的原理和源码-数据持久化方式AOF的介绍和源码解析
redis的原理和源码-redis的六种数据类型基本介绍:string、hash、list、set、zset、stream
redis的原理和源码-服务端的介绍和源码解析(命令请求的执行过程、服务器初始化过程)
Today's sleep quality record 74 points
RestTemplate
力拓信创生态,博睿数据多款产品获得东方通与达梦数据库产品兼容互认证明