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

Posted zhixiangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是函数式编程(副作用纯函数引用透明)相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

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

                  

以上是关于什么是函数式编程(副作用纯函数引用透明)的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程中如何处理副作用?

函数式编程中如何处理副作用?

前端拾遗01|从前端函数式编程开始

再识函数式编程

使用函数式编程的几个示例

Scala基础篇-函数式编程的重要特性