【函数式编程】函数式编程、纯函数、高阶函数以及函数柯里化

最近在学习React,看到了高阶函数以及函数柯里化等概念,因为对这些内容还比较生疏,于是查找了资料,发现都跟一个叫函数式编程的思想有关,于是搜集各方资料,稍微系统性地做了点自己的记录用于以后的复习。想要更系统性地学习可以翻阅这个文档:JS函数式编程指南,写得十分详细。

函数式编程

函数式编程是一种编程范式,它将计算过程视为一系列的函数调用。
函数在函数式编程中被视为一等公民,这意味着函数可以作为参数传递,也可以作为返回值返回。这与我们在传统的过程式或面向对象编程中看到的明显不同,其中主要关注的是变量的状态变化和对象的行为。

函数式编程与面向对象编程的对比

面向对象编程(OOP)和函数式编程(FP)是当前最主流的两种编程范式。面向对象编程以对象作为基本单位,强调对象之间的交互和状态变化。而函数式编程以函数为基本单位,强调的是数据的映射关系,尽可能地避免状态变化。
这两种编程范式各有优点,也有很多现代编程语言如Java、Python、JavaScript等都同时支持这两种编程范式。在实际的编程中,我们通常会结合使用这两种编程范式,根据问题的特性选择最适合的方法。

纯函数

纯函数是一种函数,其输出只由输入决定,并且在运行过程中不产生任何副作用。
这里的副作用指的是函数对外部环境的任何改变,包括但不限于改变全局变量、修改输入参数、执行I/O操作等。
例如,下面的JavaScript函数就是一个纯函数

function add(x, y) {return x + y;
}

纯函数有许多优点。首先,纯函数的行为是可预测的,因为给定相同的输入,纯函数总是返回相同的输出。其次,由于纯函数不产生副作用,它们不会改变程序的状态,这使得代码更容易理解和测试。

高阶函数

高阶函数是将函数用作参数或者返回值的函数
高阶函数是函数式编程的核心,因为它们提供了一种强大的抽象机制,可以帮助我们编写更灵活和可重用的代码。
例如,下面的JavaScript函数就是一个高阶函数:

function greaterThan(n) {return m => m > n;
}
let greaterThan10 = greaterThan(10);
console.log(greaterThan10(11));  // 输出:true

高阶函数的用途

高阶函数的一个主要用途是创建可配置的函数。在上面的例子中,我们使用greaterThan函数创建了一个新的函数greaterThan10,这个新的函数可以检查一个数是否大于10。
高阶函数也常常用于抽象出重复的代码。例如,我们可以创建一个高阶函数map,它接收一个函数和一个数组,然后应用这个函数到数组的每个元素:

function map(func, array) {let result = [];for (let item of array) {result.push(func(item));}return result;
}

高阶函数在许多函数式编程语言和库中都有广泛的应用。例如,在JavaScript的Array类中,许多方法(如map、filter和reduce)都是高阶函数。

柯里化

柯里化有两个特点:

  1. 柯里化是一种函数的转换,它是指将一个函数从可调用的 f(a, b, c) 转换为可调用的 f(a)(b)(c )。
  2. 柯里化不会调用函数。它只是对函数进行转换。
    示例:
// 柯里化函数写法
function add(x) {return function(y) {return x + y;};
}// 调用柯里化函数
const add5 = add(5);
console.log(add5(3)); // 8
console.log(add5(7)); // 12

add() 函数被柯里化为两个函数:一个是接收一个参数 y 的函数,返回 x + y;另一个是接收两个参数 x 和 y 的函数,返回 x + y。

优点

  • 函数更加灵活和可重用。通过柯里化,可以将一个多参数的函数转换为一系列单参数的函数,使函数更加灵活和可重用。
  • 可以避免重复的代码。通过柯里化,可以避免在调用函数时重复地传递参数,从而避免了重复的代码。

缺点

  • 可能会降低性能。通过柯里化,函数的性能可能会降低,因为需要额外的内存来存储函数的返回值和参数。
  • 可能会增加代码复杂度。通过柯里化,可能会增加代码的复杂度,因为需要处理额外的参数和函数返回值。

柯里化,不可变数据类型,纯函数等都是函数式编程中的概念。在React中这些概念很常见,因为React中很多涉及到函数式编程的概念。想要具体了解什么是函数式编程,可以查看JS函数式编程指南

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

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

相关文章

Android AMS——ATMS解析(四)

ActivityTaskManagerService 是 Android 系统中的核心服务之一,它负责管理应用程序的活动(Activity)和任务栈(Task Stack)。这里我们接上一篇内容继续分析 APP 启动流程, startActivity() 方法,调用了 ATMS,我们继续往下看。 一、ATMS源码分析 1、ActivityTaskManage…

AUTOSAR RTE介绍(更新版230925)

RTE是什么 AUTOSAR RTE(Run Time Environment)实现了AUTOSAR系统中的虚拟功能总线(VFB),提供了SWC(Software Component)之间的访问接口和SWC对于BSW资源的访问接口。RTE为SWC中的Runnable提供与其他SWC或者BSW模块通信的接口,RTE将Runnable映射到OS Task中,并且管理Runna…

关于vcruntime140.dll丢失如何修复,电脑多种修复vcruntime140.dll丢失方法

在使用某些软件或执行某些代码时,可能会遇到“找不到 vcruntime140.dll,无法继续执行代码”的错误提示。这通常意味着你的计算机上缺少 Visual C Redistributable for Visual Studio 2015 的运行时库,或者该库的版本不正确。 三种解决方法解决…

Polygon Miden zkRollup中的UTXO+账户混合状态模型

1. 引言 本文重点讨论Polygon Miden所设计的UTXO账户混合状态模型,以实现某些有趣的属性。 Miden的目标是:【即越具有隐私性,其可扩展性越好】 构建可扩展去中心化的rollup采用支持隐私的架构 Miden支持灵活的交易模式: 公开…

一致性 Hash 算法

是什么: 一致性 hash,是一种比较特殊的 hash 算法,它的核心思想是解决在分布式环境下, hash 表中可能存在的动态扩容和缩容的问题。 为什么会出现一致性Hash 一般情况下,我们会使用 hash 表的方式以 key-value 的方式来…

HTTP Tunnel与后门攻击

后门攻击是指利用隐藏在系统中的漏洞或者特殊设计,以获取未授权的访问权限或者绕过安全控制的攻击方式。通过后门攻击,攻击者可以在受感染的系统上进行非法操作、窃取敏感信息或者控制系统。后门攻击可以采用多种形式,其目的都是为了绕过安全…

原神启动原神启动原神启动原神启动

测试游戏抽卡场景是确保玩家可以正常抽取虚拟物品或角色的重要部分。以下是一些可能的游戏抽卡场景的测试用例示例: 1.正常抽卡流程: 2.测试用户是否能够成功进行一次或多次抽卡操作。 3.确保每次抽卡后,用户收到相应的物品或角色。 4.抽卡…

新手程序员怎么接单?

程序员如何在自己年富力强的时候,最大化发挥自己的能力?将超能力转化为“钞能力”? 有人还在苦哈哈当老黄牛,一身使不完的牛劲,有人已经另辟蹊径,开创了自己的一片致富小天地。 接单找兼职,就…

JS三大运行时全面对比:Node.js vs Bun vs Deno

全文约 5100 字,预计阅读需要 15 分钟。 JavaScript 运行时是指执行 JavaScript 代码的环境。目前,JavaScript 生态中有三大运行时:Node.js、Bun、Deno。老牌运行时 Node.js 的霸主地位正受到 Deno 和 Bun 的挑战,下面就来看看这…

国民技术N32G031系列单片机的AD采样

用过一段时间国民技术N32G031系列单片机,编程模式几乎类同STM32系列(另外一个国产32位单片机品牌兆易创新好像也是仿STM32的编程模式,看来STM32的确是一款极其优秀的产品),但是价格实惠,功能也很齐全&#…

Flink容错机制

容错机制 在Flink中,有一套完整的容错机制来保证故障后的恢复,其中最重要的就是检查点。 检查点的保存 1)周期性的触发保存 “随时存档”确实恢复起来方便,可是需要我们不停地做存档操作。如果每处理一条数据就进行检查点的保存…

React(react18)中组件通信06——redux-toolkit + react-redux

React(react18)中组件通信06——redux-toolkit react-redux 1 前言1.1 redux 和 react-redux1.2 关于redux-toolkit1.2.1 官网1.2.2 为什么要用Redux Toolkit? 1.3 安装 Redux Toolkit1.4 Redux Toolkit相关API 2. 开始例子——官网例子2.1 …

巨人互动|Facebook海外户Facebook内容的类型

随着人们日益依赖的社交媒体来进行信息获取与交流,Facebook作为全球最大的社交媒体平台之一,那么Facebook的内容都有哪些类型呢?下面小编来讲讲吧! 1、实时发生的事 我们需要实时了解时事动态,这样可以使用户对品牌发…

纯css html 真实水滴效果

惯例,不多说直接上图 秉承着开源精神,我们将这段代码无私地分享给大家,因为我们深信,信息的共享和互相学习是推动科技进步的关键。我们鼓励大家在使用这段代码的同时,也能够将其中的原理、思想和经验分享给更多的人。 这份代码是我们团队用心…

VR庆中秋丨奇幻月景邀您共赏!

中秋佳节, 如何来一场别开生面的云游月景体验? 3DVR技术开启中秋过节新姿势, 嫦娥奔月伴玉兔、 太白花间饮美酒、 吴刚月下伐桂树…… 立体化还原璀璨的传统中秋文化, 还有趣味猜灯谜活动, 丰富豪礼等你来拿&a…

如何使用ChatGPT构建一个Web应用程序?

围绕ChatGPT的最大卖点之一是它可以成为一种有效的编程工具。其想法是这样的:你用自然语言描述需求,该聊天机器人生成满足该需求的代码。但是ChatGPT在这方面到底有多好呢? 还有什么比亲自测试一下更好的方法呢?我们让ChatGPT从头…

Spring整合MyBatis原理

Spring整合MyBatis原理 整合包中(上篇文章中的配置文件,文章传送门:Spring整合第三方框架-MyBatis整合Spring实现-CSDN博客)提供了SqlSessionFactoryBean和一个扫描Mapper的配置对象,SqlSessionFactoryBean一旦被实例…

FPGA千兆网 UDP 网络视频传输,基于88E1518 PHY实现,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、我这里已有的以太网方案3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条UDP协议栈UDP视频数据组包UDP协议栈数据发送UDP协议栈数据缓冲IP地址、端口号的修改Tri Mode Ethernet MAC介绍以及移植注意事项88E1518 PHYQT上位机和源码…

【软件测试】开发/测试模型

开发/测试模型 瀑布模型 设计:技术文档(设计那些接口,库表,mq,定时任务),UI视觉稿 特点:线性的结构。 优点:每个阶段做什么,产出什么非常清晰 缺点:测试人员介入太晚…

解释器风格架构C# 代码

/*解释器风格架构是一种基于组件的设计架构,它将应用程序分解为一系列组件,每个组件负责处理特定的任务。这种架构有助于提高代码的可维护性和可扩展性。以下是如何使用C#实现解释器风格架构的步骤:定义组件:首先,定义…