首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

这个函数是否被认为是副作用,因此是不是很糟糕的FP设计?

副作用是指函数在执行过程中对函数外部的状态产生了影响,例如修改全局变量、修改文件内容、发送网络请求等。根据函数是否具有副作用,可以将函数分为纯函数和非纯函数。

纯函数是指没有副作用的函数,其输出仅由输入决定,不依赖于外部状态。纯函数具有以下特点:

  • 相同的输入始终产生相同的输出。
  • 不会修改传入的参数。
  • 不会修改全局变量或其他外部状态。

非纯函数是指具有副作用的函数,其执行可能会对外部状态产生影响。非纯函数的特点包括:

  • 输出不仅由输入决定,还依赖于外部状态。
  • 可能会修改传入的参数。
  • 可能会修改全局变量或其他外部状态。

根据上述定义,如果一个函数具有副作用,那么它被认为是非纯函数。在函数式编程(FP)中,强调使用纯函数来实现程序逻辑,以提高代码的可维护性、可测试性和并发性。

对于是否认为一个函数是副作用以及是否是糟糕的FP设计,需要根据具体情况来判断。在某些场景下,非纯函数是不可避免的,例如与外部系统交互、进行IO操作等。在这些情况下,可以通过封装和隔离非纯函数,使其对纯函数部分的影响最小化,从而保持整体代码的可维护性和可测试性。

总结:

  • 副作用是指函数对外部状态产生的影响。
  • 纯函数是没有副作用的函数,输出仅由输入决定,不依赖于外部状态。
  • 非纯函数是具有副作用的函数,可能会修改参数或外部状态。
  • 在函数式编程中,强调使用纯函数来提高代码的可维护性、可测试性和并发性。
  • 是否认为一个函数是副作用以及是否是糟糕的FP设计,需要根据具体情况来判断。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

函数式编程(FP

,会被放到执行栈上去执行,执行结束后移除,但是堆上作用域成员由于外部引用而不能释放。...因此内部函数依然可以访问外部函数成员。 可能有的同学会问,为什么有引用不会被释放?...lodash 中 FP 在lodash官网上,我们容易找到一个 function program guide 。在 lodash / fp 模块中提供了实用函数式编程友好方法。...在处理副作用之前,先聊下函子。 什么是函子? 容器:包容值和值变形关系(这个变形关系就是函数)。...因此衍生出一系列函子来解决这些问题,这里罗列一下对应函子和它们解决问题: maybe 函子: 空值问题 Either 函子:异常处理 IO 函子:副作用处理 Task 函子:异步执行 Monad

1.7K10

函数式编程漫谈

缘起数学家Alonzo Church提出了Lambda演算概念,可以用函数组合方式来描述计算过程,换句话来说,如果一个问题能够用一系列函数组合算法来表达,那么这个问题就认为是可计算。...你看这一点就印证了前面说,通过函数组合完成对结果表达,是不是很有意思。 Redux 在前端应用越来越复杂今天,数据流管理是一件很重要事,Redux就是来解决这个问题。...首先,函数式编程无副作用特点天生对并行编程提供了良好支持。在使用多线程方案时候,我们常常会遇到共享状态问题,因此我们可能会采用各种各样锁机制。一旦引入了锁,那么代码本身复杂度也就增加了。...而当我们采用FP时候,不用太担心这样问题,函数操作无副作用,不用担心共享数据带来问题。 其次,对数据分析更加友好。在Lambda架构中,通常会把数据分为两种类型,原始数据 和衍生数据。...但是从另一个角度来说,在我们使用FP时候,不用担心全局变量破坏,没有执行顺序依赖。我们在并行编程时候,也不需要依赖于过多,那么反而最终可以提升最终性能。

97120
  • 面向对象编程是计算机科学最大错误

    换句话说,这个函数不再是确定性。 为什么它突然变得不确定了?该函数修改了其范围外值,引起了副作用。...然而,它也引入了一个副作用,调用 a.value += b.value 导致对象 a 发生变化。函数参数 a 引用是对象 2,因此是 2,value 不再等于 2。...这意味着 OOP 中所有方法(也许除了静态方法)要么是非确定性,要么会引起副作用,两者都不好。因此,面向对象程序设计绝不是纯粹,它与纯粹完全相反。 有一个银弹 但是我们很少有人敢尝试。...人们依靠医生意见来治疗他们健康问题(不幸是,这在俄罗斯等国家仍然发生)。在过去,放血等无效技术一直流行。像砷这样不安全物质广泛使用。 不幸是,今天软件行业与过去医药太相似了。...说 OOP 和 FP 是互补,可能就等于说放血和抗生素是互补,是吗? OOP 违反了许多基本 FP 原则: FP 提倡纯净,而 OOP 提倡杂质。 FP 代码基本上是确定性因此是可预测

    60050

    函数组件 和 函数式编程 有关系么?

    首先,React开发理念践行了如下公式(即:UI是数据快照经过函数映射而来): UI = fn(snapshot) 要落地这个理念,有两个要素需要实现: 数据快照 函数映射 在这里,FP中「不可变数据...但状态更新也可能触发「副作用」,比如请求数据、操作DOM... 在类组件中,这些「副作用」逻辑分散在各个生命周期钩子函数中,React无法掌控。 而在函数组件中: 副作用受限在useEffect中。...每次render,React都会保证上次副作用效果已经清除(通过useEffect回调返回值函数) ref传播也需要借由forwardRef,这进一步限制了ref可能影响范围 数据请求副作用交给...同时,这也契合了FP函数思想。 总结 「函数组件」并不是「函数式编程」在React中具体实现,而是React设计理念UI = fn(snapshot)落地最好载体。...在React中,还吸收了其他编程范式中优秀思想。FP只是其中影响React最深一种。毕竟,一切落地都是为了践行最初设计理念。

    23010

    细说ReactiveCocoa冷信号与热信号系列(2)

    说起来拗口。太多细节不多讨论,我们着重关注下FRPFP特征。 FP有个很重要概念是和我们主题相关,那就是纯函数。 纯函数就是返回值只由输入值决定、而且没有可见副作用函数或者表达式。...是的,从FP角度看OOP是充满副作用。...而后续对desc也会进行flattenMap,得到了renderedDesc,因此未来renderedDesc订阅时候,fetchData也会被间接订阅。...接下来也许你会问,如果我整个计算过程中都没有副作用是否就不会有这个问题?答案是肯定。试想下刚才那段代码如果没有网络请求,换成一些标准化计算会怎样。...然而Objective-C语言中并没有这种纯函数优化,因此有大规模运算冷信号对性能是有一定影响。 从上文内容可以看出,如果我们想更好地掌握RAC这个框架,区分冷信号与热信号是十分重要

    85870

    成为函数式编程工程师四年,我为什么说它既“流氓”又“可爱”

    函数,即没有副作用函数(即它们输出是其输入的确定性函数),更容易理解和测试,因为你不必怀疑函数行为是否会根据隐藏状态而改变。...而在另一个极端,FP 是一种编写所谓“纯”代码方式——也就是没有副作用代码,是纯粹、参考透明函数。 有些人已经深深地爱上了 FP(非常可以理解!),他们简直将 FP 当作了一种信仰。...因此,我把它称为 FP “宗教信仰”。但只要是“宗教”就会有一个问题,那就是可能存在盲目的教条主义。 对于 FP 来说,我认为它蒙蔽了许多人眼睛,让他们看不清一些本该显而易见东西。...而且我非常喜欢那些组织得很好代码,我可以容易和安全地改变它以适应新需求。 因此,如果软件工程目标是正常运作、可理解及可维护软件,那么顺着这个逻辑提出问题是:函数式编程能帮助我们实现它吗?...毕竟,我们是美化、会说话猿猴,填充我们头骨脂肪从来就不是为了写软件而设计

    32920

    校长讲堂第五讲

    为了模仿电源打开情形,我们要设计一条 C 语句来显式地调用这个子程序。经过一些思考,我们写出了下面的语句: (*(void(*)())0)(); 这样表达式会令 C 程序员心惊胆战。...可以这样写: (*fp)(); 如果 fp 是一个指向函数指针,则*fp 就是函数本身,因此(*fp)()是调用它一种方法。...如果 C 可以读入并理解类型,我们可以写: (*0)(); 但这样并不行,因为*运算符要求必须有一个指针作为他操作数。另外,这个操作数必须是一个指向函数指针,以保证*结果可以调用。...,其二进制表示中某一位置位(换句话说,它是 2 某次幂),并且你希望测试一个整型变量 flags 该位是否置位。...= EOF) putc(c, out); 这个 while 循环中表达式看起来像是 c 赋以 getc(in)值, 接下来判断是否等于 EOF 以结束循环。

    42931

    深入探索ScalaOption

    程序员最深恶痛绝并力求避免异常是NullPointerException,很不幸,我们往往又会忽略这个错误。不知是谁设计了Null这样对象。...正如Paul Chiusano等人著作《Scala函数式编程》描述那样: 对函数式程序员而言,程序实现,应该有一个纯内核和一层很薄外围来处理副作用。...演讲中提到REA选择函数式编程三个原因: 模块化(Modularity) 抽象(Abstraction) 可组合性(Composability) 模块化一个重要特征是设计没有副作用函数,这样就不会影响调用该纯函数上下文...那么,想像一下当这样方法系统中许多地方直接或间接调用,可能会造成什么样灾难?!假设这样代码放到安全要求极高系统中,你是否会感到不寒而栗?...当然,我们可以运用防御式编程,将可能错误防御在正常逻辑代码之前,但它带来阅读体验却会非常糟糕。 即使针对这些错误进行判断,仍然无法解决一个问题是当对象真的出现错误时,函数实现究竟该如何处理?

    1.1K70

    Scalaz(22)- 泛函编程思维: Coerce Monadic Thinking

    刚好年底这几天抽空重审了一遍,这时才真正认识到让一个老资格OOP程序猿去编写一段FP程序时会发生什么事情:他会用FP语法和数据类型按照OOP思维编写程序。...其结果就是一段尴尬代码,让人看得不知怎么去形容,更不用提FP程序精简高雅了。我在前面博文示范程序正是落入了这个OOP思维陷阱。...首先我们再次回想一下函数式编程一些最基本要求: 1、纯代码(pure code):实现函数组合-这点在前面的功能函数组件编程中已经做到 2、无副作用(no-side-effect):尽量把副作用推到程序最外层...看看这个版本trigger:因为直接获取了isUSStandard和isCoffeePresentBoolean运算值所以需要立即注入依赖。首先后果是trigger现在是有副作用了。...即使我们通过输入参数传入这个Reader组合依赖也会破坏了函数可组合性(composibility),影响函数组件重复利用。

    492100

    再谈编程范式(3):理解面向过程面向对象函数式编程精髓

    因此,我们需要使用利刀分解前面描述类层次树形结构,使用更小、可组合替换它们,包括使用这种特点编程范式-函数式编程,这类语言-GO、F 函数式编程(FP这个函数源于数学里函数,因为它起源是数学家...1、函数式编程显著特征-不可变|无副作用|引用透明 在函数式编程中,一个变量一旦赋值,是不可改变。没有可变变量,意味着没有状态。...说是一个函数只管接受一些入参,进行计算后吐出结果,除此以外不会对软件造成任何其他影响,把这个叫做没有副作用。因为没有中间状态,因此一个函数输出只取决于输入,只要输入是一致,那么输出必然是一致。...纯函数可以容易地测试,考虑到所需要只是测试输入和确认(预期)结果。 纯函数缺点是,它将操作置于数据之上。如果一个纯函数只产生与输入相同输出,那么它就不能返回其他不同(也许是有意义)值。...因此,OOP可以支持可变性,但其语言也可能允许不可变性。Java、C++、C#、Python、Ruby和Perl可以认为是面向对象编程语言,但它们并不完全支持可变性或不可变性。

    1.2K20

    函数式思维

    自从大四看了三章《SICP》之后我就自诩为一个函数式编程爱好者,之前也在公司分享过一个 Haskell Topic,效果非常糟糕,讲到后来已经没剩几个人了,只得草草收场。...在写这篇文章时候我突然想起来,之前还发过一个朋友圈,跟人论述我对范畴论一些概念理解,翻了翻朋友圈找到了: ? fp0.jpeg ? fp1.jpeg 我自己读了一遍…… ?...letters[digit].map(mapper) mapper 是一个返回值为数组函数,我们只要用 letters[digit].flatMap(mapper) 就可以了,然而遗憾 JS...真正函数式语言(Haskell)是没有副作用(或者说隐藏了副作用),而真实世界却充满副作用,为了能够正常工作并且保持自己纯粹,它引入了范畴论中各种概念,很有意思但确实有比较高门槛,而且那些复杂理论学了平常用不到很快就忘了...但函数思维,却是可以成为一种习惯,融入日常开发中

    39910

    无处不在幂等性

    关于幂等性 ---- 维基百科上,关于幂等性介绍有: 在数学里,幂等有两种主要定义。 在某二元运算下,幂等元素是指自己重复运算(或对于函数是为复合)结果等于它自己元素。...除了上面提到容器启动设计,常见还有: 2.1 接口设计 接口设计是我们经常碰到工作,但是我们对于接口假设往往是,因为各种各样原因,我们接口出现异常情况是不可避免因此我们设计重点并不是完全杜绝接口出问题...这在http接口设计上大家可能还是比较有感觉,但是在平时实现功能接口时可能就不太注意了,很多初入门者,为了方便,往往定义了很多全局变量,实现函数是有副作用,相同输入,可能得不到相同输出,这通常会使得维护变得糟糕...这也是这些年函数式编程咸鱼翻生根本原因,相对于面向对象编程,函数式编程更加容易保持幂等性,因为面向对象编程时大家容易去修改类属性,这样容易导致再一次执行时就没法保持幂等性了。...2.5 状态设计 这又是一个更加容易忽略情况,但是状态设计往往是系统架构设计中关键一环,通常弄清楚了状态转化过程,那么你业务系统可能就相当清晰了。

    55440

    深入理解JavaScript函数式编程

    fn } } } 闭包本质:函数在执行时候会放到一个执行栈上当函数执行完毕之后会从执行栈上移除,「但是堆上作用域成员因为外部引用不能释放」,因此内部函数依然可以访问外部函数成员...(fn){ let cache = {}; return function(){ //1 判断cache是否这个fn结果 let key = JSON.stringify...:这样是非常不好设计,那么loadsh是否提供了这样解决方案呢?...value是一个函数,这里把函数作为值来处理;IO函子可以把不纯动作存储到_value中,延迟执行这个不纯操作(惰性执行),包装当前操作把不纯操作交个调用者处理 //IO 函子 const fp...副作用会让一个函数不纯,但是副作用是不可避免,因为代码难免会依赖外部文件、数据库等,只能最大程度上控制副作用在可控范围内 柯里化函数curry也是高阶函数 柯里化函数内部用到了闭包,对函数参数做了缓存

    4.3K30

    24.精读《现代 JavaScript 概览》

    作者在文中说, 现代JavaScript 很多概念和思想在快速传播和扩展, 很多新概念出现在前端相关博客和文档中, 这些概念对于很多前端开发人员来说, 仍然陌生....因此我们有必要来学习一下现代这些 JavaScript概念, 看这些概念在现在 JavaScript 库或应用中是怎么使用. 2 内容概要 文章讲了很多现代JavaScript中概念, 罗列如下...: 纯函数副作用 在了解纯函数之前, 首先要了解副作用....可变对象与不可变对象 可变对象与不可变对象概念清楚, 可变对象指的是在创建后值仍可以改变, 不可变对象指的是创建后值无法改变....函数式编程 FP 上面我们了解函数, 无状态, 不可变对象, 命令式编程, 和高阶函数, 都是很重要函数式编程组成.

    54020

    面向对象变成VS函数式编程

    面向对象编程(OOP)和函数式编程(FP)是软件开发中两种主要范式。这两种方法都为组织、设计和实现软件系统提供了不同方法论。...一流功能:函数视为一等公民,这意味着它们可以分配给变量,作为参数传递,并从其他函数返回。 引用透明性:函数结果仅取决于其参数,而不取决于任何可变状态或外部因素。...副作用: OOP 代码可能通过在其范围之外修改状态而产生副作用FP 旨在通过将副作用限制在定义良好边界内来最小化副作用,使程序更可预测且更易于推理。...以下是在各个维度上对比面向对象编程(OOP)和函数式编程(FP表格表示: 方面 面向对象程序设计(OOP) 函数式编程(FP) 易变 涉及可变状态和对象。 涉及可变状态和对象。...副作用 通过状态改变产生副作用。 目的是通过纯度来减少副作用。 并发 需要仔细管理共享状态。 通过不可变数据提升并发性。 表达式 提供清晰抽象和直观建模。 导致简洁、声明性函数代码。

    10910

    深入理解函数式编程(下)

    一方面,这种副作用管理方式是一种高级抽象形式,不易理解;另一方面,我们在学习和使用函数式编程过程中,几乎都会遇到类似的副作用问题需要解决,能否解决这个问题也决定了一门函数式编程语言最终是否能走上成功...React Hooks设计巧妙,以useEffect为例: 图 43 在函数组件中,useState用来产生状态,在使用useEffect时候,我们需要挂载这个state到第二个参数,而第一个参数给到运行函数在...这个过程中你就像是在搭积木,容易就把业务给“搭建”完成了。 5....高度可组合 函数之间复用方便(需要关注状态量更少),函数功能升级改造也更容易(高阶组件)。 副作用隔离 所有的状态量收敛到一个盒子(函数)里面处理,关注点更加集中。...日常业务开发中,往往我们需要取长补短,在适合领域用适合方法/范式。大家只要要记住,软件开发并没有“银弹”。 7. FAQ Q:你觉得Promise是不是一种Monad IO模型? A:我认为是的。

    93930

    Js-函数式编程 前言什么是函数式编程为什么Js支持FP函数柯里化组合 compose范畴学functorMonadApplicative FunctorFunctorMonadApplic

    前言 JavaScript是一门多范式语言,即可使用OOP(面向对象),也可以使用FP函数式),由于笔者最近在学习React相关技术栈,想进一步深入了解其思想,所以学习了一些FP相关知识点,本文纯属个人读书笔记...即对过程进行抽象,将数据以输入输出流方式封装进过程内部,从而也降低系统耦合度。 为什么Js支持FP Js支持FP一个重要原因在于,在JS中,函数是一等公民。...没有特殊情况、没有副作用,没有 API 请求、没有变量修改,单纯执行计算。这样做可以使得我们容易保存了每一次state改变情况,对于时间旅行这种需求更是天然亲近。...对函数式代码来说,pointfree 是非常好石蕊试验,因为它能告诉我们一个函数是否是接受输入返回输出函数。比如,while 循环是不能组合。...渲染现在大家都可以理解幂等渲染地好处了,其实函数式编程各种作用和状态也是幂等,对于复杂应用非常有帮助。 复用 引用透明,无副作用,代数设计函数式代码可以正确优雅地复用。

    1.8K40

    42. 精读《前端数据流哲学》

    因为当时前端还在野蛮人时代,生存问题都没有解决,哪还有功夫思考什么数据流,设计模式?前端也是那时候觉得比后端水。...redux 概念太超前了,一步到位强制把副作用隔离掉了,但自己又没有深入解决带来代码冗余问题,让我们又爱又恨,于是一部分人把目光转向了 mobx,这个响应式数据流框架,这个没有强制分离副作用,所以写起来舒服框架...多提一句,rxjs 对数据流纯函数抽象能力非常强大,因此前端主要工作在于抽一个工具,将诸如事件、请求、推送等等副作用都转化为数据源。...,比如发请求,也提供了封装好函数转化为数据源,因此,将 redux middleware 中副作用,转移到了数据源转换做成中,让 action 保持纯函数,同时增强了原本就是纯函数 reducer...唯独 mobx,缺少了对副作用抽象这一层,所以导致了代码写比 redux 和 rxjs 更爽,但副作用与纯函数混杂在一起,因此函数式无缘。

    92020

    要深入 JavaScript,你需要掌握这 36 个概念

    由于其他编程语言都使用类,因此 JS 中类语法使开发人员在各种语言之间移动变得更加简单。” 工厂函数是不是返回对象类或构造函数函数。...纯函数指的是一个函数返回结果只依赖于它参数,并且在执行过程里面没有副作用函数副作用是指当调用函数时,除了返回函数值之外,还对主调用函数产生附加影响。...区别在于箭头函数不绑定到this,arguments,super或new.target关键字。 这使得箭头函数在某些情况下是一个不错选择,而在另一些情况下则是一个非常糟糕选择。...32.设计模式 设计模式(Design pattern)代表了最佳实践,通常被有经验面向对象软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临一般问题解决方案。...每种编程语言都有一套单独良好实践。 尽管这些“良好”做法是主观,并且在工作场所之间存在差异,但有些惯例认为是“良好”。 通过遵循这些代码原则,可以确保每个人都可以阅读和维护你代码。

    46910

    可爱 Python:Python 中函数编程

    这是一个稳妥答案,但不能确切地阐明问题。不幸是,即使是函数程序员他们自己也很难对 FP 究竟是什么有个一致认识。“盲人摸象”故事用来形容这一情况似乎合适。...在 Python 1.x 中,apply() 函数对于将一个函数列表返回值直接应用于另一个函数方便。Python 2.0 为这一目的提供了改进语法。...我们 的确仍然利用了实用程序函数 monadic_print(),但这个函数是完全一般性,可以在我们以后创建每个函数程序表达式中重用(它是一次性成本)。...FP(特别是 Haskell)对于“不执行任何操作,在进程中有副作用函数具有“单一体”意思。 ...消除副作用在除去完美的、有意义语句不用而代之以晦涩、嵌套表达式工作后,一个自然问题是:“为什么?!”我对 FP 所有描述都是使用 Python 做到

    90720
    领券