为什么功能性编程中不应使用变量赋值

19 浏览
0 Comments

为什么功能性编程中不应使用变量赋值

我正在学习函数式编程,我能理解为什么不变性比可变对象更受青睐。

这篇文章也很好地解释了这一点。

但我无法理解为什么赋值应该在纯函数内执行。

我能理解的一个原因是,变量的可变性导致锁定,由于在Scala中的纯函数中我们大多数是尾递归,这会在调用栈上创建变量/对象,而不是在堆上创建。

除此之外,还有什么原因要避免函数式编程中的变量赋值吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

在赋值和重新赋值之间有区别。函数式编程中不允许重新赋值,因为它的可变性在纯函数中不被允许。允许变量赋值。

val a = 1 //assignment allowed
a = 2 //re-assignment not allowed

在函数式编程中,以不纯的方式(改变状态)从外部世界读取是一个副作用。

因此,访问可以潜在地被突变的全局变量的函数不是纯函数。

使生活变得简单。

通常情况下

当你有纪律的生活不再混乱。这正是函数式编程所倡导的。当生活变得不那么混乱,你可以专注于生活中更好的事情。

因此,不可变性的主要原因

使用变异在程序正确性方面变得困难。在并发程序的情况下,这是非常痛苦的调试。

这意味着要跟踪变量的变化以了解代码/程序或调试程序会变得很困难。

变化是程序难以理解和推理的一个副作用。

函数式编程强制执行这种纪律(使用不变性),以使代码可维护、表达和可理解。

变化是一种副作用

纯函数没有副作用。

副作用:

  1. 变量的突变
  2. 可变数据结构的变异
  3. 读或写文件/控制台(外部来源)
  4. 抛出异常以停止程序

避免上述副作用使函数仅依赖于函数的参数,而不依赖于任何外部值或状态。

纯函数是最孤立的函数,它既不从世界中读取也不写入世界。它不会停止或打破程序的控制流程。

以上属性使纯函数易于理解和推理。

纯函数是数学函数

这是一个从余域到范围的映射,其中余域中的每个值都映射到范围中的一个值。

这意味着如果f(2)等于4,则与世界的状态无关,f(2)始终等于4。

纯函数是一组输入和一组允许的输出之间的关系,具有每个输入恰好与一个输出相关的特性。

0