函數副作用-纯函数

处理纯函数中的副作用 纯函数是指在相同的输入下,总是返回相同的输出,并且没有任何副作用的函数。为了保持函数的纯粹性,我们可以将副作用封装在函数内部、使用高阶函数、Monad或Promise等方法来处理副作用。高阶函数是接受一个或多个函数作为参数,并返回一个新函数的函数。我们可以利用高阶函数将副作用分离出来,并将纯函数与副作用函数解耦。函数用于处理异步请求的结果。通过将副作用封装在Monad中,我们可以确保纯函数只处理纯数据,而不会直接与副作用交互。一种常见的方法是将副作用封装在函数内部,这样可以确保函数本身仍然是纯函数。 阅读详情

函数副作用

 

在计算器科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。

函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。

下面是函数的副作用相关的几个概念, 纯函数(Pure Function)、非纯函数(Impure Function)、引用透明(Referential Transparent)。

目录

  [隐藏] 

·         1 纯函数

·         2 非纯函数

·         3 引用透明

·         4 范例(Java)

·         5 特殊的函数副作用

·         6 纯函数的优点

纯函数

纯函数(PureFunction)是这样一种函数——输入输出数据流全是显式(Explicit)的。

显式(Explicit)的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值;函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过返回值传递到该函数外部。

非纯函数

如果一个函数通过隐式(Implicit)方式,从外界获取数据,或者向外部输出数据,那么,该函数就不是纯函数,叫作非纯函数(ImpureFunction)。

隐式(Implicit)的意思是,函数通过参数和返回值以外的渠道,和外界进行数据交换。比如,读取全局变量,修改全局变量,都叫作以隐式的方式和外界进行数据交换;比如,利用I/OAPI(输入输出系统函数库)读取配置文件,或者输出到文件,打印到屏幕,都叫做隐式的方式和外界进行数据交换。

引用透明

引用透明(ReferentialTransparent)的概念与函数的副作用相关,且受其影响。 如果程序中两个相同值得表达式能在该程序的任何地方互相替换,而不影响程序的动作,那么该程序就具有引用透明性。它的优点是比非引用透明的语言的语义更容易理解,不那么晦涩。纯函数式语言没有变量,所以它们都具有引用透明性。

范例(Java)

 f(x) 
 { 
   return x + 1 
 }

f(x)函数就是纯函数。

 a = 0 
 q(x) { 
   b = a 
 }

q(x)访问了函数外部的变量。q(x)是非纯函数。

 p(x){ 
   print “hello” 
 }

p(x)通过I/O API输出了一个字符串。p(x)是非纯函数。

 c(x) { 
   data = readConfig() // 读取配置文件 
 }

c(x)通过I/O API读取了配置文件。c(x)是非纯函数。

纯函数内部有隐式(Implicit)的数据流,这种情况叫做副作用(SideEffect)。我们可以把副作用想象为潜规则。上述的I/O,外部变量等,都可以归为副作用。因此,纯函数的定义也可以写为,没有副作用的函数,叫做纯函数。

I/O API可以看作是一种特殊的全局变量。文件、屏幕、数据库等输入输出结构可以看作是独立于运行环境之外的系统外全局变量,而不是应用程序自己定义的全局变量。

特殊的函数副作用

上述只讨论了一般的情界。这种情况,严况,还有一种特殊的情况,我们没有讨论。有些函数的参数是一种In/Out作用的参数,即函数可能改变参数里面的内容,把一些信息通过输入参数,夹带到外格来说,也是副作用。也是非纯函数。 比如下面的函数。

 process(context) {
   a = context.getInfo()
   result = calculate( a )
   context.setResult( result )
 }

纯函数的优点

纯函数的好处主要有几点:

·        无状态。线程安全。不需要线程同步。

·        纯函数相互调用组装起来的函数,还是纯函数。

·        应用程序或者运行环境(Runtime)可以对纯函数的运算结果进行缓存,运算加快速度。

转自:http://zh.wikipedia.org/zh-tw/%E5%87%BD%E6%95%B0%E5%89%AF%E4%BD%9C%E7%94%A8

 


使用纯函数处理副作用的 JavaScript 编程学习 首先,让我们来看一下纯函数的定义。相同的输入总是返回相同的输出。没有对外部环境产生可观察的副作用。这个add函数是一个纯函数,因为它接受两个参数并返回它们的和。无论何时调用add(2, 3),都会得到结果5,并且没有对外部环境产生任何副作用。在 JavaScript 中,通过使用纯函数处理副作用,我们可以减少代码的复杂性,并使代码更易于测试和维护。本文介绍了处理副作用的几种常见技术,包括返回值、参数传递和高阶函数。 阅读详情

相关推荐

纯函数与副作用:提升代码的可读性与效率

本文深入探讨了纯函数的概念及其与副作用的关系,通过减少副作用来优化程序性能和提升代码的可读性。我们学习了引用透明性和纯函数的优势,以及如何通过重构不纯的函数和使用缓存来避免副作用。此外,文章还探讨了在特定情况下,如何合理利用副作用来实现性能优化。

weixin_42518874的博客 351

纯函数(Pure functions)

理解纯函数的概念

frontendchen的博客 2167

STM32F103ZET6驱动57闭环步进电机(连线+代码)

一、设备: 1. STM32F103开发板 (普中F103的板子) 2. 57闭环电机带驱动 3. 24V/3A的直流电源,用于给电机驱动供电 简单说明:使用Keil5编程,主要使用了PWM波,外部中断和时间中断,按键控制电机使能和脱机并且控制PWM的周期,调节周期即调节电机的转速。 二、STM32开发板与电机驱动的连线: 1.PUL-、ENA-、DIR-与STM32的连接方法: 可以参考CSND的这个链接中的说明,使用共阴极接法:STM32F407-用TB6600驱动器驱动57步进电机(代码

baidu_39071234的博客 7428

JS中的纯函数

函数式编程中有一个非常重要的概念叫纯函数(pure function),javascript符合函数式编程的范式,所以也就有纯函数的概念。在React开发中,纯函数是被多次体积的,react就要求组件必须像是一个纯函数,redux中有一个reducer的概念,也要求必须是一个纯函数。如果我们在执行一个函数时,除了返回函数值之外,还对调用函数产生了附加的影响。(比如修改了参数,修改了全局变量等),这就是造成了副作用。纯函数在执行的过程中就是不能产生这与的副作用,因为副作用往往是bug的温床,很不好。首先来看s

qq_39112047的博客 1618

MATLAB 论文复现——基于虚拟储能的电动汽车充放电调度策略及激励评价

文章基于虚拟储能聚合体仿真模型优化电动汽车充放电调度,并采用复合权重评价电动汽车的充电激励。根据电动汽车灵活性和系统稳定性衡量其贡献大小,并通过模糊推理系统模拟用户的充电意愿,实现对电动汽车充电的引导和优化。[1]陈朔,胡昊,方慧敏,等.基于虚拟储能的电动汽车充放电调度策略及激励评价[J/OL].系统仿真学报,1-12[2024-07-24].https://doi.org/10.16182/j.issn1004731x.joss.23-1316.基于虚拟储能的电动汽车充放电调度策略及激励评价。

sjr1478的博客 363

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)

使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追

soulproficiency的博客 2268

纯函数及函数的副作用详解

纯函数概念: 就是一个函数的返回结果只依赖于传给它的参数(没有使用外部的全局变量等),并且在执行过程中没有副作用,我们就把这个函数叫做纯函数。 例: 函数的副作用: 指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。 函数副作用会给程序设计带来不必要的麻烦,给程序带来十分难以查找的错误,并且降低程序的可读性。严格的函数式语言要求函数必须无副作用。 纯函数的优点: 1.可复用性 纯函数仅依赖于传入的参数,这意味着你可以随意将这个函数移植到别的代码中

马儿不会飞 1702

WIFI基础入门--802.11g--增强速率物理层ERP--15

WIFI基础入门--802.11--增强速率物理层--191.802.11g的组件保护机制 1.802.11g的组件 802.11g其实是将好几种物理层规范合而为一。虽然统称为增强速率物理层(Extended Rate PHY简称ERP),但是实际上ERP有好几种不同的方式: ERP-DSSS与ERP-CCK 这两种模式向下兼容于原始直接序列规范(1Mbps与2Mbps),以及所提到的802.11...

香蕉一号 4617

什么是纯函数

纯函数的基本概念和作用说明示例一:基础纯函数示例二:对比非纯函数示例三:纯函数与数组操作示例四:纯函数在事件处理中的应用示例五:纯函数用于缓存优化在Web前端开发中,理解和掌握纯函数(Pure Function)的概念对于构建高效、可预测的应用程序至关重要。纯函数不仅能够提升代码的可读性和维护性,还能增强应用的性能和可靠性。本文将深入探讨纯函数的基本概念、作用及其在实际项目中的应用。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1238

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1563

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1075

纯函数是什么?怎么合理运用纯函数?

前言 纯函数这个这个词我相信小伙伴们多多少少都听说过,它是函数式编程的基础。本文主要是对纯函数进行探讨,包括基本概念,优点,运用的经典案例以及我们日常该如何去合理的使用等等。 纯函数的概念 首先我们来看看纯函数的基本概念: 相同的输入,总是会的到相同的输出,并且在执行过程中没有任何副作用。 该怎么去理解上面的概念呢?我们要把上面这句话拆成两部分来看。 相同的输入,总是会得到相同的输出。 来看看下面的例子: let a = 1; function xAdd(x) { return x + a;

qq_42002487的博客 1349

【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案

在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。

奶爸的编程之路,也就一周冷个三天 1077

纯函数与副作用

现代的JS有许多概念或者说一些编程技巧,这些概念有来自于其他语言、一些设计模式或者js语言特有的概念等。下面就来说一下与函数式编程密切相关的两个概念:纯函数和副作用 副作用 在计算机科学中,函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。 ---维基百科 例如在javascript的内置的一些函数是有副作用的: [1, 2, 3].pop() // 每次执行pop函数,原数组都会减少一个元素 [1, 2, 3].splic.

_ 3999

【SystemVerilog基础】SystemVerilog Assertion 概述

断言主要是描述复杂的设计行为;是传统验证方法学一个很好的补充,可以检查到电路内部细节,相当于一种白盒验证,传统的验证方法学是纯粹的黑盒验证!property跟上面的sequence差别不大,唯一有差别可能多了两个implication(|->,|=>)注意,当有前置条件时,不满足前置条件不会fail,而是伪真!上面这个因为没有前置条件,每个周期都会去检查!注意:当没有前置条件时,不满足条件会直接fail!

MoorePlus的博客 331

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

副作用与纯函数--纯函数化是副作用处理的基本方案

一、纯函数: 函数:(只)参量依赖、解决确定、环境无修改。 函数与输入、输出、环境的关系。 二、副作用 (Side Effect)是指函数或者表达式的行为依赖于外部世界。具体可参照Wiki上的定义,副作用是指 1)函数或者表达式修改了它的SCOPE之外的状态 2)函数或者表达式除了返回语句外还与外部世界或者它所调用的函数有明显的交互行为 https://www.cnb...

diaoju3333的博客 559

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

在javascript中使用纯函数处理副作用

在javascript中使用纯函数处理副作用 今天给大家带来一片译文, 详情请点击这里.可能在墙内哦 开始了, 如果你点开这篇文章, 就证明你已经开始涉及函数式编程了, 这距离你知道纯函数的概念不会很久. 如果你继续下去, 你就知道纯函数是真重要, 没有它你将寸步难行.你可能听过这样的话: "纯函数让你理清你的代码", "纯函数不可能会引起副作用","纯函数式引用透明的". 这些话没错, 纯函数是...

weixin_34106122的博客 743

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

副作用和纯函数

什么是副作用? --- 副作用就是:函数或者表达式 在局部环境中,修改了某些变量的值(改变了外部环境的变量值) 什么是纯函数? ---1、函数返回的结果只依赖入参 例如:const a = 1 const foo = (b) => a + b // 这不是一个纯函数,他的返回结果还依赖外部变量a foo(2) // => 3 const foo = (a, ...

zw19940808的博客 469

函数的副作用 —— 纯函数的理解

函数副作用指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。 纯函数 纯函数(Pure Function)——输入输出数据流全是显式(Explicit)的。 显式的意思是,函数与外界交换数据只有一个唯一渠道——参数和返回值;函数从函数外部接受的所有输入信息都通过参数传递到该函数内部;函数输出到函数外部的所有信息都通过返回值传递...

weixin_30332705的博客 665

纯函数以及副作用的理解

//纯函数:相同的输入总是得到相同的输出 //slice/splice 纯函数/不纯的函数 let arr = [1,2,3,4,5,6,7] //下标0到下标3,不包含3 console.log(arr.slice(0,3));// [ 1, 2, 3 ] console.log(arr.slice(0,3));// [ 1, 2, 3 ] console.log(arr.slice(0,3));// [ 1, 2, 3 ] //下标0,三个 console.log(arr.splice(0,3));.

weixin_46267084的博客 513

1-14、纯函数的副作用

我这个岁数的程序圆,学点东西不容易啊,不比你们精神小伙啊。 所以。 不废话了,赶紧努力吧! 当数据需要依靠外部来源的时候,纯函数的结果就得不到相同输出,这就是副作用。 外部数据:全局变量、接口数据、用户输入的信息。 副作用让纯函数变得不纯,使方法的通用性下降,给程序带来安全隐患带来不稳定性。但是副作用不可能完全禁止,所以尽量控制它发生的范围。 示例: // 不纯函数:min的发现改变时,函数的返回结果会发生变化 let min = 18; function getAge(age) { return ag

qq_41543217的博客 592

副作用函数与纯函数

副作用函数,纯函数,引用透明,Vue的副作用函数

dbeidouxingf的博客 270

js函数式编程中的纯函数与副作用

一、纯函数 纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用。 举例1:数组的两个方法:slice与splice。 这两个函数的作用并无二致——但是注意,它们各自的方式却大不相同,但不管怎么说作用还是一样的。我们说 slice 符合纯函数的定义是因为对相同的输入它保证能返回相同的输出。而 splice 却会嚼烂调用它的那个数组,然后再吐出来;这就会产生可观察...

ThisEqualThis的博客 1152

纯函数理解和定义,以及副作用

1.纯函数: 输入相同,输出相同,(如果不是就是副作用,后面会讲到) 2.有slice/splice 进行测试 let array = [1,2,3,4] // slice / splice // 纯函数 console.log(array.slice(0,3)); // [1,2,3] console.log(array.slice(0,3)); // [1,2,3] console.log(array.slice(0,3)); // [1,2,3] console.lo...

ybilss的博客 301

HOC、副作用、纯函数

higher order commponent 高阶组件 是纯函数,没有副作用 传入组件 return组件。抽离重复使用代码、实现组件的复用。相同的输入有相同的输出。

weixin_41166309的博客 93

前端纯函数和副作用概念,且在react上的体现详解

副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。个人理解:导致这个函数相同的输入,会产生不一样的输出,就是副作用//纯的在不纯的版本中,checkAge的结果将取决于minimum这个可变变量的值。换句话说,全局作用域下的minimum改变之后,会影响checkAge的结果。在纯的版本中,minimum值被限定在函数作用域中,外部无法直接修改,所以函数结果只会和参数age有关。

weixin_43416349的博客 981
上一篇: Monad 最简介绍
下一篇: Monad-进阶理解
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值