为啥不应该在函数式编程中使用变量赋值

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。

纯函数是一组输入和一组允许输出之间的关系,其属性是每个输入都与一个输出相关。

【讨论】:

以上是关于为啥不应该在函数式编程中使用变量赋值的主要内容,如果未能解决你的问题,请参考以下文章

再看函数式编程

函数式编程

python学习笔记011——函数式编程

函数式编程

函数式编程 本质(笔记)转载

函数式编程 JS 中的数组赋值