为啥不应该在函数式编程中使用变量赋值
Posted
技术标签:
【中文标题】为啥不应该在函数式编程中使用变量赋值【英文标题】:Why variable assignments should not used in functional programming为什么不应该在函数式编程中使用变量赋值 【发布时间】:2017-07-01 19:11:20 【问题描述】:我正在学习函数式编程,我可以理解为什么不可变比可变对象更受欢迎。
This的文章也解释的很好。
但我无法理解为什么要在纯函数内部执行赋值。
我能理解的一个原因是变量可变性导致锁定,因为在 scala 中的纯函数中,我们主要是尾递归,这会在调用堆栈而不是堆上创建变量/对象。
在函数式编程中应该避免变量赋值还有其他原因吗?
【问题讨论】:
纯函数只依赖于给它的参数。这意味着每次使用相同的参数调用该函数时都会返回相同的结果。如果函数使用在函数外部定义的变量,那么它不会每次都返回相同的结果。这取决于变量! 看看***.com/questions/1791408/… 如果变量是函数的本地变量并且没有在其他地方使用怎么办? 如果给定相同的参数,函数每次返回相同的结果(没有副作用),它是(外部)纯的。 我发现这个问题可以回答你的问题:softwareengineering.stackexchange.com/questions/196112/… 【参考方案1】:分配和重新分配之间存在差异。在函数式编程中不允许重新赋值,因为它的可变性在纯函数中是不允许的。允许变量赋值。
val a = 1 //assignment allowed
a = 2 //re-assignment not allowed
以不纯的方式(改变状态)从外部世界读取是函数式编程的副作用。
因此,访问可能发生变异的全局变量的函数不是纯函数。
让生活变得轻松。
一般
当你自律时,生活就不那么混乱了。这正是函数式编程所提倡的。当生活不那么混乱时,您可以专注于生活中更好的事情。
所以,不变性的主要原因
很难推断带有突变的程序的正确性。在并发程序的情况下,调试起来非常痛苦。
这意味着为了理解代码/程序或调试程序,很难跟踪变量所经历的变化。
突变是使程序难以理解和推理的副作用之一。
函数式编程强制执行此规则(使用不变性),以便代码可维护、可表达且易于理解。
变异是副作用之一
纯功能是没有副作用的。
副作用:
-
变量的变异
可变数据结构的变异
读取或写入文件/控制台(外部源)
向停止程序抛出异常
避免上述副作用使函数仅依赖于函数的参数,而不是任何外部值或状态。
纯函数是最孤立的函数,既不从世界读取也不向世界写入。它不会停止或中断程序控制流。
以上属性使纯函数易于理解和推理。
纯函数是数学函数
它是从 co-domain 到 range 的映射,其中 co-domain 中的每个值都映射到 range 中的一个值。
这意味着如果 f(2) 等于 4,那么无论世界的状态如何, f(2) 都是 4。
纯函数是一组输入和一组允许输出之间的关系,其属性是每个输入都与一个输出相关。
【讨论】:
以上是关于为啥不应该在函数式编程中使用变量赋值的主要内容,如果未能解决你的问题,请参考以下文章