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

时间:2022-09-28 19:25:45

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

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

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

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

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

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

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

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