大白话详细解读函数之柯里化

1. 函数柯里化是什么?

函数柯里化是一种将多参数函数转换成一系列单参数函数的技术。简单来说,就是把一个接收多个参数的函数,变成每次只接收一个参数,并返回一个新函数,直到所有参数都接收完毕,最后返回结果。

举个例子:

  • 普通函数:add(a, b, c),一次性接收 3 个参数。

  • 柯里化函数:add(a)(b)(c),每次只接收 1 个参数,分 3 次调用。

2. 为什么需要函数柯里化?

柯里化的主要作用是:

  1. 参数复用:可以固定一部分参数,生成一个新的函数,方便复用。

  2. 延迟执行:可以在需要的时候再传入剩余的参数,延迟函数的执行。

  3. 函数组合:方便将多个函数组合在一起,形成更复杂的逻辑。

3. 函数柯里化的实现

3.1 普通函数
function add(a, b, c) {return a + b + c;
}console.log(add(1, 2, 3)); // 输出 6
3.2 柯里化函数
function curriedAdd(a) {return function(b) {return function(c) {return a + b + c;};};
}console.log(curriedAdd(1)(2)(3)); // 输出 6
  • 第一次调用 curriedAdd(1),返回一个新函数。

  • 第二次调用 返回的函数(2),再返回一个新函数。

  • 第三次调用 返回的函数(3),最终返回结果 6

3.3 通用的柯里化函数

我们可以写一个通用的柯里化函数,将任意多参数函数转换成柯里化函数:

function curry(fn) {return function curried(...args) {if (args.length >= fn.length) {return fn.apply(this, args);} else {return function(...moreArgs) {return curried.apply(this, args.concat(moreArgs));};}};
}// 使用柯里化函数
const curriedAdd = curry(add);
console.log(curriedAdd(1)(2)(3)); // 输出 6

4. 函数柯里化的应用场景

4.1 参数复用

柯里化可以固定一部分参数,生成一个新的函数,方便复用。

function add(a, b, c) {return a + b + c;
}const curriedAdd = curry(add);
const add2 = curriedAdd(2); // 固定第一个参数为 2
console.log(add2(3)(4)); // 输出 9 (2 + 3 + 4)
4.2 延迟执行

柯里化可以延迟函数的执行,直到所有参数都传入。

function log(date, level, message) {console.log(`[${date.getHours()}:${date.getMinutes()}] [${level}] ${message}`);
}const curriedLog = curry(log);
const logNow = curriedLog(new Date()); // 固定第一个参数为当前时间
logNow('INFO')('This is a message.'); // 输出:[12:30] [INFO] This is a message.
4.3 函数组合

柯里化可以方便地将多个函数组合在一起,形成更复杂的逻辑。

function compose(f, g) {return function(x) {return f(g(x));};
}const add1 = x => x + 1;
const multiply2 = x => x * 2;const addThenMultiply = compose(multiply2, add1);
console.log(addThenMultiply(5)); // 输出 12 (5 + 1 = 6, 6 * 2 = 12)

5. 函数柯里化的优缺点

5.1 优点
  • 代码复用:可以固定一部分参数,生成新的函数。

  • 灵活性:可以延迟执行,方便函数组合。

  • 可读性:将多参数函数拆分成单参数函数,逻辑更清晰。

5.2 缺点
  • 性能开销:每次调用都会生成一个新的函数,可能会增加内存和性能开销。

  • 复杂性:对于初学者来说,柯里化的概念可能不太容易理解。

6. 总结

  • 函数柯里化:将多参数函数转换成一系列单参数函数。

  • 作用:参数复用、延迟执行、函数组合。

  • 实现:通过返回新函数,逐步接收参数,直到所有参数都传入。

  • 应用场景:参数复用、延迟执行、函数组合等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++网络编程】第2篇:简单的TCP服务器与客户端

一、TCP通信流程回顾 1. 服务器端流程 1. 创建Socket → socket() 2. 绑定地址和端口 → bind() 3. 开始监听 → listen() 4. 接受客户端连接 → accept() 5. 接收/发送数据 → recv()/send() 6. 关闭连接 → closesocket()2. 客户端流程 1. 创建Socket → socket() 2. 连接…

Spring IoC DI入门

一、Spring,Spring Boot和Spring MVC的联系及区别 Spring是另外两个框架的基础,是Java生态系统的核心框架,而SpringMVC是Spring 的子模块,专注于 Web 层开发,基于 MVC 设计模式(模型-视图-控制器&#xff…

【uniapp】记录tabBar不显示踩坑记录

由于很久没有使用uniapp了,官方文档看着又杂乱,底部tab导航栏一直没显示,苦思许久,没有发现原因,最后网上搜到帖子,list里的第一个数据,pages 的第一个 path 必须与 tabBar 的第一个 pagePath 相…

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案,能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,从而能够快速响应服务器问…

穿透递归的本质:从无限梦境到可控魔法的蜕变之路

穿透递归的本质:从无限梦境到可控魔法的蜕变之路(C实现) 一、递归:程序员的盗梦空间 在计算机科学的宇宙中,递归是最接近魔法本质的编程范式。它像一面镜子中的镜子,引导我们通过自我相似性破解复杂问题。…

1.5.4 掌握Scala内建控制结构 - 条件循环

本次实战主要围绕Scala语言中的内建控制结构,特别是条件循环进行学习和实践。通过while循环和do-while循环两种结构,分别实现了计算1到100的累加和以及打印所有水仙花数的任务。在while循环中,首先定义了初始条件和循环条件,然后通…

MySQL程序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器,是⼀个多线程程序,对数据⽬录进⾏访问管理(包含数据库…

0321美团实习面试——技能大致内容

专业技能 1.掌握盒⼦模型,Flex响应式布局和BFC等问题 盒⼦模型 Flex布局 媒体查询 结合Handleresize.ts监听设备 BFC 2.掌握原型链,异步,事件循环和闭包等问题 原型链 异步 class Promise {static resolve(value) {if (value instanceof…

分布式任务调度

今天我们讲讲分布式定时任务调度—ElasticJob。 一、概述 1、什么是分布式任务调度 我们可以思考⼀下下⾯业务场景的解决⽅案: 某电商平台需要每天上午10点,下午3点,晚上8点发放⼀批优惠券 某银⾏系统需要在信⽤卡到期还款⽇的前三天进⾏短信提醒 某…

微分方程求解及推导过程

微分方程求解及推导过程 本文将系统地推导微分方程: d z ( t ) d t A z ( t ) B u ( t ) \frac{\mathrm{d}\boldsymbol{z}(t)}{\mathrm{d}t} \boldsymbol{A}z(t) \boldsymbol{B}u(t) dtdz(t)​Az(t)Bu(t) 的通解过程,并分析其物理意义。 1. 初始条…

SQL 中 WHERE 与 HAVING 子句的使用

在编写 SQL 查询时,数据过滤是常见需求。WHERE 和 HAVING 子句虽然都用于筛选数据,但实际用法大不相同。本文通过具体示例对比两者的核心区别,并结合实际场景演示联合使用技巧,助力快速掌握这两个关键工具的正确用法。 一、数据表…

Sampling – Model Context Protocol Specification

网页链接 https://spec.modelcontextprotocol.io/specification/draft/client/sampling/ 主要内容概述 该网页详细介绍了Model Context Protocol (MCP) 中的“Sampling”功能。Sampling允许服务器通过客户端请求语言模型(LLM)生成文本、音频或图像内容…

STM32-汇编2、外设

1.异常处理 reserved保留 ;将所有异常都初始化成一个函数 2.nop 空指令,什么不干&#xf…

汇能感知高品质的多光谱相机VSC02UA

VSC02UA概要 VSC02UA是一款高品质的200万像素的光谱相机,适用于工业检测、农业、医疗等领域。VSC02UA 包含 1600 行1200 列有源像素阵列、片上 10 位 ADC 和图像信号处理器。它带有 USB2.0 接口,配合专门的电脑上位机软件使用,可进行图像采集…

在C语言基础上学Java【Java】【一】

众所周知,Java是C风格的语言,对于学过C语言的人学Java可以快速适应。 废话不多说,直接边看代码边学。 数据类型,输入和输出 import java.util.Scanner;//为了使用Scanner public class a1 {//a1是类名,就是文件名&am…

Spring组件初始化扩展点:BeanPostProcessor

目录 一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessBeforeInitialization2、postProcessAfterInitialization 四、实战案例案例1:实现简单的属性打印案例2:动态代理增强(模拟AOP) 五、常见应用场景六、注意…

多模态RAG框架(二)OmniSearch (Self-adaptive Planning Agent) and Dynamic VQA Dataset

OmniSearch:Benchmarking Multimodal RAG with Dynamic VQA Dataset and Self-adaptive Planning Agent 文章链接:2411.02937 Github链接:Alibaba-NLP/OmniSearch: Repo for Benchmarking Multimodal Retrieval Augmented Generation with …

Multisim学习-04 示波器的使用

我们选择一个信号源来说明示波器的使用。 模拟电路中平常一般用ac,am,fm,clock就可以演示了。 截图说明: 1)波的周期时长,首先应该调整这个参数,它的倒数就是频率。这个参数如果不适合&#xf…

2025年03月16日Github流行趋势

项目名称:glance 项目地址url:https://github.com/glanceapp/glance项目语言:Go历史star数:13768今日star数:889项目维护者:svilenmarkov, c0smicdev, wfg, DVDAndroid, jonasknobloch项目简介:…

aws训练快速入门教程

AWS 相关核心概念 简洁地介绍一下AWS训练云服务的核心关联概念: AWS核心服务层: 基础设施层: EC2(计算), S3(存储), RDS(数据库)等人工智能层: SageMaker(训练平台), AI服务等 机器学习服务分级: 高层: 预构建AI服务(开箱即用)中层: SageMaker(主要训练平台)底层: 框架和基…