什么是函数式编程(副作用、纯函数、引用透明)

    副作用的概念:一个带有副作用的函数不仅只是简单的返回一个值,还干了一些其他的事情,比如:

      • 修改一个变量
      • 直接修改数据结构
      • 设置一个对象的成员
      • 抛出一个异常或以一个错误终止
      • 打印到终端或读取用户的输入
      • 读取或写入一个文件
      • 在屏幕上绘画

    因此我们对于函数式程序的判定边界就在于:函数的副作用。

    于是——当函数没有副作用,那么我们就说这个函数符合函数式编程(FP);再给出纯函数这个概念用来定义一个函数没有副作用,我们可以说纯函数构成的程序风格就是函数式的!

    buyCoffee的例子(p3):函数只不过是需要返回一杯咖啡,可是却对费用进行了持久化操作(产生副作用),我们可以在buyCoffee方法返回咖啡时也把费用作为值一并返回,将费用这条记录交给其他程序来做持久化,以此来去除副作用  ====》通过把这些副作用推到程序的外层,来转换任何带有副作用的函数(纯的内核和一层很薄的外围来处理副作用)

    引用透明:对于程序p,如果它包含的表达式e满足引用透明,所有e都可以替换为它的运算结果而不会改变程序p的含义(要求函数不论进行任何操作都可以用它的返回值来代替)。

    引用透明与纯函数的关联:假如存在一个函数f,若表达式f(x)对所有引用透明的表达式x也是引用透明,那么这个f是一个纯函数(也就是说,传入引用透明的x表达式给f,函数f(x)的返回值可以代替这个函数在其他程序起的作用)

    纯函数的好处:纯函数是模块化的、可组合的,因为它从“对结果做什么(返回值)”和“如果获取输入(通过参数传递获得输入)”中分离了计算本身的逻辑,就像一个黑盒子。

                  

原文地址:https://www.cnblogs.com/zhixiangshu/p/10054065.html

时间: 2024-07-31 04:30:23

什么是函数式编程(副作用、纯函数、引用透明)的相关文章

js函数式编程(1)-纯函数

我将写的第一个主题是js的函数式编程,这一系列都是mostly adequate guide这本书的读书总结.原书在gitbook上,有中文版.由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱.中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正.正文如下. 如果一个函数是纯函数,那么其不依赖外部环境,并且不产生副作用. 1.不依赖外部环境,反例如下: const a1 = 10; const aFunc1 = () => { // 依赖外部变量 return a1;

函数式编程—高阶函数

一.函数式编程概念简介 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元 就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言:越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种

函数式编程中的函数—函数式编程的多态

函数式编程中的函数—函数式编程的多态 保存了计算上下文和计算过程的特殊值 保存了计算上下文和计算过程的有输入输出的可计算结构. 保存了计算上下文和计算过程的可配置结构:(柯里化). 函数作为一种特殊的值和结构,可以由更高阶的函数对其进行组合.变换.柯里化等操作: 函数作为输入和输出:本质上都是可配置.可计算结构. 可配置的是作为参量输入的计算上下文: 可计算是计算上下文配置完备后直接进行计算: 普通函数: 参数函数(闭包函数): 高阶函数: 返回函数(内部函数): 值函数:被其它函数引用和调用的

Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") return test1 res = test() print(res) 输出结果 test <function test1 at 0x021F5C90> 分析:这里print(res)输出的是te

纯函数、透明引用、副作用的含义

Side Effects(副作用) According to Wikipedia, a function is said to have a side effect "if, in addition to returning a value, it also modifies some state or has an observable interaction with calling functions or the outside world." Side effects inc

Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. 而函数式编程(请注意多了一个"式"字)--Functional Programming,虽然也可以归结到面向过程的程序设计,但其思想更接近数学计算. 我们首先要搞明白计算机(Computer)和计算(Compute)的概念. 在计算机的层次上,CPU执行的是加减乘除的指令代码

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

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

C#函数式编程之由函数构建函数

在面向对象的编程中,如果我们需要复用其他的类,我们可以通过继承来实现.而在函数式编程中我们也可以采取不同的方式来复用这些函数.今天的教程将会讲述两种方式,其中一个就是组合,将多个函数组合成为一个函数,另一个则是之前我们介绍过的部分应用,当然我们将会讲述如何将其高级化,来符合我们的使用要求. 组合 顾名思义,组合就是将函数A的结果传递给函数B.但是我们并不关注函数A的结果,当然大多数一定会这样去做: 1 var r1 = funcA(1); 2 var r2 = funcB(r1); 这样显然不是

Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = lambda x,y: x+y print(f(1,2)) 二.三元表达式 # x >y ? x :y # 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果 x= 2 y=1 r = x if x > y else y print(r) # 2 三.map 四.map与lambda

Python自学笔记之函数式编程5——返回函数

函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 要实现一个可变参数的求和,通常函数是这样定义的: def calc_sum(*args):     ax = 0     for n in args:         ax = ax + n     return ax 但是,如果不需要立刻求和,而是在后面的代码中根据需要再计算怎么办?可以不返回求和的结果,而是返回求和的函数: def lazy_sum(*args):     def sum():