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

     2023-03-23     220

关键词:

【中文标题】为啥不应该在函数式编程中使用变量赋值【英文标题】: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。

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

【讨论】:

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

纯函数式编程语言中的变量也不是命令式编程语言中的变量,即存储状态的单元,而是代数中的变量,即一个值的名称。变量的值是不可变的(immutable),也就是说不允许像命令式编程语言中那样多次给一个变量赋值。比如说在... 查看详情

前端进击的巨人:略知函数式编程(代码片段)

系列更文前三篇文章,围绕了一个重要的知识点:"函数"。函数调用栈、函数执行上下文、函数作用域到闭包。可见不理解函数式编程,代码都撸不好。 函数是一等公民函数与其它数据类型一样,可以作为值赋给变量,作为... 查看详情

函数式编程

1.函数式编程第一等公民  也就是说函数与其他数据类型一样处于平等地位可以赋值给其他变量。可以作为参数传入另一个函数。或者作为别的函数的返回值。    代码中的print变量就是一个函数,可以作为另一个函数的... 查看详情

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

】函数式编程JS中的数组赋值【英文标题】:ArrayAssignmentinFunctionalProgrammingJS[closed]【发布时间】:2021-10-2513:06:55【问题描述】:当在函数内部声明一个新的局部变量并将其分配给一个与数组相等的全局变量时,什么更好?选项1:... 查看详情

函数式编程 - 非常强调递归,为啥?

】函数式编程-非常强调递归,为啥?【英文标题】:FunctionalProgramming-Lotsofemphasisonrecursion,why?函数式编程-非常强调递归,为什么?【发布时间】:2012-09-2111:51:11【问题描述】:我开始了解函数式编程[FP](使用Scala)。从我最初的... 查看详情

“完全”函数式编程(代码片段)

引子有了面向对象编程,还需要函数式编程吗?函数式编程,有什么妙处?函数式的理念主要是:函数式编程是将程序看成是一系列函数的组合。可以将函数作为变量进行赋值,作为函数参数传入,也可以作为返回值返回,函数... 查看详情

c++:调用无参数的构造函数为啥不加括号

如图加了括号之后报错内容是什么意思1、不使用初始化语句;2、不使用延时语句;3、不使用循环次数不确定的语句,如:forever,while等;4、尽量采用同步方式设计电路;5、尽量采用行为语句完成设计;6、always过程块描述组合... 查看详情

函数式编程语言

 1、什么是函数式编程语言?  函数式编程语言(functionalprogramming language)或称函数程序设计,又称泛函编程,是一种编程典范,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语... 查看详情

为啥你可以在函数中使用另一种方法而不是赋值运算符来更改 Ruby 中局部变量的值?

】为啥你可以在函数中使用另一种方法而不是赋值运算符来更改Ruby中局部变量的值?【英文标题】:WhycanyouchangethevalueofalocalvariableinRubyinafunctionusinganothermethodbutnotwithanassignmentoperator?为什么你可以在函数中使用另一种方法而不是... 查看详情

什么是函数式编程(代码片段)

...体的函数还有各种限制,具体见链接。所以函数式编程也应该是一个从入参到返回值的黑盒子。概述并不是所有人在函数式编程的定义上达成了共识。一般来说,函数式编程是使用函数来编程的一种编程范式。但是这个定义并不... 查看详情

spark函数式编程进阶

函数式编程进阶1、函数和变量一样作为Scala语言的一等公民,函数可以直接复制给变量;2、函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要名称,但是匿名函数赋值给一个变量(其... 查看详情

函数式编程(代码片段)

编程的方法论:面向过程面向对象函数式 函数式编程的定义:函数式=编程语言定义的函数+数学意义上的函数(先想到一个数学模型,再用python上的功能实现这个逻辑) y=x+1defcat():returnx+1  特性:1.不用变量保存状... 查看详情

firstweek(补充完整)(代码片段)

...LandURIPractice:1.TomcatServerinstallation   一、数学和函数式编程函数式编程由Lambda演算得来,因此它与我们学过的数学非常类似。在学习函数式编程之前,我们最好忘记之前头脑中的一些编程思想(如学习CC++的时候),因... 查看详情

为啥我不应该在这个简单的函数中使用 `const`?

】为啥我不应该在这个简单的函数中使用`const`?【英文标题】:WhyshouldInotuse`const`inthissimplefunction?为什么我不应该在这个简单的函数中使用`const`?【发布时间】:2017-02-1209:32:47【问题描述】:在学习C++时,学习函数概念的第一... 查看详情

函数式编程语言(代码片段)

...计语言)的分类?   通常可分为4类:命令式语言、函数式语言、逻辑语言和面向对象的语言(实际上还有很多不同的划分版本)    1、命令式编程语言(imperativelanguage)      计算机体系结构是影响语言设计的... 查看详情

scala学习笔记-函数式编程(14)

将函数赋值给变量1//Scala中的函数是一等公民,可以独立定义,独立存在,而且可以直接将函数作为值赋值给变量2//Scala的语法规定,将函数赋值给变量时,必须在函数后面加上空格和下划线34defsayHello(name:String){println("Hello,"+name)}... 查看详情

js全局变量是全局对象的属性,函数局部变量为啥就不是函数的属性呢?

能不能详细阐述和解释一下,JS中函数局部变量与函数属性之间的关系以及区别。局部变量和全局变量同名时,会隐藏这个全局变量;4.变量关键字:4.变量4.1变量的类型JS是松散类型的语言4.2变量的声明var声明是变量的标准声明var... 查看详情

在scala中过滤字符串列表的函数

...问题描述】:我只是开始使用Scala编程或函数式编程。我应该编写一个过滤字符串列表的函数(练习中给出了main的第一行)。它应该返回单词“Hellopeople”。我已经使用变量来管理它,但我的老师告诉我修改它以不使用任何var。... 查看详情