为什么功能性编程中不应使用变量赋值
为什么功能性编程中不应使用变量赋值
我正在学习函数式编程,我能理解为什么不变性比可变对象更受青睐。
这篇文章也很好地解释了这一点。
但我无法理解为什么赋值应该在纯函数内执行。
我能理解的一个原因是,变量的可变性导致锁定,由于在Scala中的纯函数中我们大多数是尾递归,这会在调用栈上创建变量/对象,而不是在堆上创建。
除此之外,还有什么原因要避免函数式编程中的变量赋值吗?
admin 更改状态以发布 2023年5月22日
在赋值和重新赋值之间有区别。函数式编程中不允许重新赋值,因为它的可变性在纯函数中不被允许。允许变量赋值。
val a = 1 //assignment allowed a = 2 //re-assignment not allowed
在函数式编程中,以不纯的方式(改变状态)从外部世界读取是一个副作用。
因此,访问可以潜在地被突变的全局变量的函数不是纯函数。
使生活变得简单。
通常情况下
当你有纪律的生活不再混乱。这正是函数式编程所倡导的。当生活变得不那么混乱,你可以专注于生活中更好的事情。
因此,不可变性的主要原因
使用变异在程序正确性方面变得困难。在并发程序的情况下,这是非常痛苦的调试。
这意味着要跟踪变量的变化以了解代码/程序或调试程序会变得很困难。
变化是程序难以理解和推理的一个副作用。
函数式编程强制执行这种纪律(使用不变性),以使代码可维护、表达和可理解。
变化是一种副作用
纯函数没有副作用。
副作用:
- 变量的突变
- 可变数据结构的变异
- 读或写文件/控制台(外部来源)
- 抛出异常以停止程序
避免上述副作用使函数仅依赖于函数的参数,而不依赖于任何外部值或状态。
纯函数是最孤立的函数,它既不从世界中读取也不写入世界。它不会停止或打破程序的控制流程。
以上属性使纯函数易于理解和推理。
纯函数是数学函数
这是一个从余域到范围的映射,其中余域中的每个值都映射到范围中的一个值。
这意味着如果f(2)等于4,则与世界的状态无关,f(2)始终等于4。
纯函数是一组输入和一组允许的输出之间的关系,具有每个输入恰好与一个输出相关的特性。