函数式编程范式

文章目录

  • 函数式编程范式
    • 不可变性(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

函数式编程优势

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

函数式编程缺陷

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

函数式工具实践

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

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

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

相关文章

bug bug bug

importError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。 Traceback (most recent call last): File "D:\yolov8_about\ultralytics-main3\trainCPU.py", line 4, in <module> from ultralytics import YOLO File "…

python项目通过docker部署到Linux系统并实现远程访问

背景需求&#xff1a;在Windows系统编写了简单的python代码&#xff0c;希望能通过docker打包到Linux Ubuntu系统中&#xff0c;并运行起来&#xff0c;并且希望在本地Windows系统中能通过postman访问。 目录 一、原本的python代码 二、创建一个简单的Flask应用程序 三、创…

基于深度学习的内容推荐

基于深度学习的内容推荐系统通过分析用户行为、内容特征以及用户与内容之间的交互数据&#xff0c;自动向用户推荐他们可能感兴趣的内容。这类系统在新闻、视频、音乐、社交媒体等平台中广泛应用。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 内容推荐系统的主要任…

js求和reduce使用方法

1.使用循环结构&#xff08;如for循环&#xff09;进行累加 let sum 0; for (let i 1; i < 100; i) {sum i; } console.log(sum); // 输出5050 2.使用Array.prototype.reduce方法进行数组元素求和&#xff1a; const numbers [1, 2, 3, 4, 5]; const sum numbers.re…

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗?

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗&#xff1f; MySQL内部分为server层和存储引擎层。一般情况下存储引擎都用innodb。 server层有很多模块&#xff0c;其中需要关注的是执行器是用于跟存储引擎打交道的组件。 执行器可以通过调用存储引擎提供的接口&…

整合StarRocks更新表全部知识点

总结StarRocks更新表的全部内容的集合&#xff08;V3.2版本&#xff09; 一、基本功能 聚合函数replace的聚合表主键被主键表替代采用Merge-On-Read的策略&#xff0c;读取时需要在线Merge多个版本的数据文件&#xff0c;谓词和索引无法下推至底层数据&#xff0c;会严重影响…

LeetCode:对称的二叉树(C语言)

1、问题概述&#xff1a;给一个二叉树&#xff0c;看是否按轴对称 2、示例 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 3、分析 &#xff08;1&a…

解决 Android 应用安装错误:INSTALL_FAILED_BAD_PERMISSION_GROUP

解决 Android 应用安装错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP 在开发 Android 应用时&#xff0c;我们有时会遇到安装错误。这篇文章将讨论一种常见的错误&#xff1a;INSTALL_FAILED_BAD_PERMISSION_GROUP&#xff0c;并介绍解决方法。 问题描述 在尝试安装…

Go实用技巧

Golang实用技巧 Golang实用技巧 Context 1. 为了gorouines更可靠&#xff0c;避免实用context.Background()2. 不幸得是&#xff0c;context.Value 不是我们的朋友3. 使用context.WithoutCancel 保持 context 活跃 Context 1. 为了gorouines更可靠&#xff0c;避免实用con…

教学用MQTT工具的思考

前言 我在《智能物联网应用设计》课程中有个实验就是学习MQTT的使用&#xff0c;目前使用的是以下几个工具&#xff1a; 客户端使用MQTTX本地服务器使用的是mosquitto 云端服务器采用的巴法云协议分析软件采用的是Wireshark 这里Wireshark基本没有啥可以替代的&#xff0c;而…

Vue3 study

Vue3 工程 创建 还是能像 vue2 一样通过 vue-cli 创建&#xff0c;即 vue create projectName 但是官方更推荐 vite 创建&#xff0c;即 npm create vuelatest&#xff0c;然后从项目名开始配置 总结&#xff1a;入口在 index.html&#xff0c;它会引入 main.ts&#xff0c;…

Win11 操作(四)g502鼠标连接电脑不亮灯无反应

罗技鼠标连接电脑不亮灯无反应 前言 罗技技术&#x1f4a9;中&#x1f4a9;&#xff0c;贴吧技术神中神&#xff01; 最近买了一个g502&#xff0c;结果买回来直接插上电脑连灯都不亮&#xff0c;问了一下客服。客服简单的让我换接口&#xff0c;又是下载ghub之类的&#xf…

Go 1.22 remote error: tls: handshake failure

Golang 1.22 remote error: tls: handshake failure 1.22之前运行下面代码是没有错误 package mainimport ("crypto/tls""fmt""net/http" )func main() {http.DefaultTransport.(*http.Transport).TLSClientConfig &tls.Config{InsecureS…

从零开始!JupyterNotebook的安装教程

安装 Anaconda 1、下载 Anaconda&#xff1a; 访问 Anaconda 官方网站 (https://www.anaconda.com/products/distribution/) 下载适合您操作系统的 Anaconda 发行版。 2、安装 Anaconda&#xff1a; Windows&#xff1a;运行下载的安装程序&#xff0c;选择“Just Me”…

Leetcode—297. 二叉树的序列化与反序列化【困难】

2024每日刷题&#xff08;148&#xff09; Leetcode—297. 二叉树的序列化与反序列化 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(…

Esxi 上的 CentOS 7.6 系统中搭建本地 Yum 源

1. 挂载 CentOS 安装盘 在 ESXi 管理界面中&#xff0c;将 CentOS 安装 ISO 文件挂载到虚拟机。 2. 挂载光盘镜像 在虚拟机中执行以下命令&#xff0c;将安装盘挂载到 /mnt/cdrom&#xff1a; mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom3. 禁用所有默认的 YUM 源 进入…

4. kubernetes资源——deployment无状态负载

kubernetes资源——deployment无状态负载 一、deployment无状态负载1、deployment无状态负载 二、创建deployment1、创建deployment2、验证副本维护 三、deployment滚动更新1、创建pod2、测试滚动更新流程2.1、修改镜像版本、或者副本数2.2、执行更新2.3、查看更新过程2.4、查看…

低代码+工作流:拔高企业效率的数字化神器

前言 传统的软件开发过程中&#xff0c;随着产品业务的不断更新迭代&#xff0c;会产生大量的重复性的工作。这些重复性的工作其实是遵循着某种特定的规则&#xff0c;假如在开发阶段我们没有做好很好的抽象&#xff0c;在后期做新业务新产品时&#xff0c;我们仍然要花费大量…

AutoMySQLBackup execution.. Backup failed Docker部署mysql 自动备份失败!!

摘要&#xff1a; Docker容器部署的mysql5.7版本遇到使用AutoMYSQLBackup备份失败了&#xff0c;反复修改automysqlbackup.conf也不起效。这里推荐一种新的办法绕开老路子直接备份。 目录 一、环境介绍 二、AutoMYSQLBackup 三、问题描述 四、解决思路 4.1第一种解决思…

Java黑色界面陪玩高端小程序源码陪练APP源码H5公众号源码电竞系统

&#x1f680;【电竞新纪元】解锁高端陪玩小程序源码 & 陪练APP秘籍&#xff0c;H5公众号全攻略&#xff01; &#x1f3ae; 开篇&#xff1a;电竞热潮下的新机遇 Hey游戏迷们&#xff01;随着电竞行业的蓬勃发展&#xff0c;你是否也想在这股浪潮中分得一杯羹&#xff1…