当前位置: 首页 > news >正文

函数式编程范式

文章目录

  • 函数式编程范式
    • 不可变性(Immutable)
    • 纯函数(Pure Functions)
    • 函数作为一等公民(First-Class Functions)
    • 高阶函数(Higher-Order Functions
    • 函数组合(Function Composition)或函数柯里化(Function Currying)
  • 函数式编程优势
  • 函数式编程缺陷
  • 函数式工具实践

函数式编程范式

不可变性(Immutable)

  • 数据是不可变的,即一旦创建就无法更改。这意味着对数据的所有操作都是返回新数据,而不是修改原始数据
// 不可变的数据操作
const arr = [1, 2, 3];
const newArr = arr.concat(4); // 返回一个新数组 [1, 2, 3, 4]

纯函数(Pure Functions)

  • 纯函数是指给定相同的输入,始终返回相同的输出,并且没有副作用(不修改外部状态,也不依赖于外部状态)
// 纯函数
function add(x, y) {return x + y;
}// 纯函数的特点:
// - 同样的输入 (2, 3) 总是返回相同的输出 (5)
// - 没有副作用,不修改外部状态

函数作为一等公民(First-Class Functions)

  • 函数是一等公民意味着函数可以像其他数据类型一样被传递、返回和存储。
  • 例如,可以将函数作为参数传递给另一个函数,或者将函数作为返回值返回
// 函数作为参数传递
function applyFunction(fn, value) {return fn(value);
}function square(x) {return x * x;
}console.log(applyFunction(square, 5)); // 输出 25// 函数作为返回值
function createAdder(x) {return function(y) {return x + y;};
}const addFive = createAdder(5);
console.log(addFive(10)); // 输出 15

高阶函数(Higher-Order Functions

  • 高阶函数是指接受一个或多个函数作为参数,或返回一个函数作为结果的函数。例如,map、filter 和 reduce 都是高阶函数
// 高阶函数
function map(array, fn) {let result = [];for (let i = 0; i < array.length; i++) {result.push(fn(array[i]));}return result;
}const numbers = [1, 2, 3];
const squared = map(numbers, (x) => x * x);
console.log(squared); // 输出 [1, 4, 9]

函数组合(Function Composition)或函数柯里化(Function Currying)

// 函数组合
function compose(f, g) {return function(x) {return f(g(x));};
}const addOne = (x) => x + 1;
const double = (x) => x * 2;const addOneAndDouble = compose(double, addOne);
console.log(addOneAndDouble(5)); // 输出 12

函数式编程优势

  • 原子化粒度:由函数组成一个个单元
  • 更易于测试:纯函数没有副作用,它们只依赖于输入参数,因此更容易编写测试用例和验证函数的正确性
  • 易于并行和并发编程:不可变性和纯函数使得并行计算变得更加安全,因为多个线程可以安全地并行执行不依赖于共享状态的纯函数
  • 函数复用:高阶函数和函数组合使得函数可以复用和组合,减少了代码重复,提高了代码的复用性
  • 可维护性:函数的重用和组合,使得代码更模块化,同时纯函数减少了代码变更带来的副作用
  • 利于 TypeScrpt:泛型能得到大量的应用

函数式编程缺陷

  • 可读性:高阶函数会降低可读性
  • 闭包:函数式编程会产生大量的闭包

函数式工具实践

  • Lodash/fp: 提供函数式编程风格的 Lodash 函数。
  • Ramda: 专注于函数式编程的 JavaScript 库。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • go-kratos 学习笔记(6) 数据库gorm使用
  • 后端返回列表中包含图片id,如何将列表中的图片id转化成url
  • vue3 命令运行窗口暴露网络地址,以及修改端口号
  • AI技术革命对未来就业的影响
  • GUI图形化界面操作(下部)
  • 基于Java的微博传播分析系统的设计与实现
  • 设计模式实战:任务调度系统的设计与实现
  • Vue2从基础到实战(v-bind对于样式控制的增强-操作style)
  • Python 和 Boto3 生成 Amazon S3 对象的 HTTPS URL
  • 2025第十九届中国欧亚国际军民两用技术及西安国防电子航空航天暨无人机展
  • UE5.4内容示例(3)FBX_Import_Options - 学习笔记
  • postMessage 收到消息类型 “webpackWarnings“
  • C#实现数据采集系统-modbustcp数据通知
  • 云服务器部署vite前端项目
  • Flink内存管理机制
  • 深入了解以太坊
  • Android Studio:GIT提交项目到远程仓库
  • Apache Pulsar 2.1 重磅发布
  • classpath对获取配置文件的影响
  • java8 Stream Pipelines 浅析
  • js
  • JS专题之继承
  • markdown编辑器简评
  • uni-app项目数字滚动
  • 搭建gitbook 和 访问权限认证
  • 翻译--Thinking in React
  • 消息队列系列二(IOT中消息队列的应用)
  • 在Docker Swarm上部署Apache Storm:第1部分
  • Spring Batch JSON 支持
  • 阿里云ACE认证学习知识点梳理
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 如何在招聘中考核.NET架构师
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​Java并发新构件之Exchanger
  • !!Dom4j 学习笔记
  • #if 1...#endif
  • #pragma multi_compile #pragma shader_feature
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • $nextTick的使用场景介绍
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (13)DroneCAN 适配器节点(一)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (k8s)Kubernetes本地存储接入
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八)Flask之app.route装饰器函数的参数
  • (苍穹外卖)day03菜品管理
  • (第27天)Oracle 数据泵转换分区表
  • (二开)Flink 修改源码拓展 SQL 语法
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (转)甲方乙方——赵民谈找工作
  • (转)人的集合论——移山之道
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .Net - 类的介绍