【发布时间】:2021-07-29 05:09:57
【问题描述】:
在计算机科学中,函数式编程是一种编程范式 将计算视为对数学函数的评估 并避免状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
谁能解释一下什么是状态和可变数据?谁能给我 JAVA 或 JavaScript 的例子。
【问题讨论】:
标签: java javascript functional-programming immutability
在计算机科学中,函数式编程是一种编程范式 将计算视为对数学函数的评估 并避免状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
谁能解释一下什么是状态和可变数据?谁能给我 JAVA 或 JavaScript 的例子。
【问题讨论】:
标签: java javascript functional-programming immutability
mutable 建议任何可以改变的东西,即一个 int
int a = 0;
System.out.prtinln(a); //prints 0
a = 2;
System.out.prtinln(a); //now prints 2, so its mutable
在java中,字符串是不可变的。您不能仅更改字符串值的引用。
String s1 = "Hello";
System.out.println(s1); //prints Hello
String s2 = s1;
s1 = "Hi";
System.out.println(s2); //prints "Hello" and not "Hi"
状态是一个类的实例将拥有的东西(一个对象)。
如果一个对象的属性具有某些值,则它处于不同的状态,那么同一类的另一个对象具有不同的属性值
【讨论】:
状态统称为对象中存储的决定对象当前属性的数据。例如,如果您有一个BankAccount 对象,则该帐户的所有者和其中的金额表示该帐户的状态。
然而,并非所有状态都对函数式编程不利,只有 可变+ 的状态是不可接受的。例如,组成字符串的字符就是该字符串的状态。如果您无法更改字符串的内容,则称它具有 不可变 状态。这非常符合函数式编程范式。
【讨论】:
可变状态是可以使函数返回不同值的一切,尽管它被调用时使用相同的参数。
Java 中的简单示例:
public static double badSqrt(double x) {
double r = Math.sqrt(x);
if (System.currentTimeMillis() % 42L == 0L) return r;
return r + 0.000000001;
}
此函数有时会计算出稍微不正确的结果。我们说badSqrt 是不纯的,因为它的结果不仅仅取决于它的参数(和常量)。
对于调试包含对 badSqrt() 或不纯函数的调用的程序的人来说,这通常是一场噩梦。通常,该程序似乎有效,但有时会提供错误的结果。除非函数有明确的文档或源代码可用,否则很难跟踪错误。
在这种情况下,据说函数的行为取决于可变状态。这种状态可以被程序的完全不相关的部分改变(突变),或者像例子中的那样,被另一个程序(操作系统)改变。
【讨论】:
不可变对象的典型示例是 Java String 类的实例。
String s = “ABC”;
s.toLowerCase();
System.out.println(s);
输出 = ABC
这是因为 s 继续引用它的不可变字符串。如果要对 s 进行变异,则需要使用不同的方法:
s = s.toLowerCase();
这将创建一个新引用。现在 String s 引用了一个包含 "abc" 的新 String 对象。
【讨论】:
假设 int i=5;
现在变量 i 的状态是 ,现在它包含值 5。
假设现在我设置了 i=7;
现在变量 i 的状态是 ,现在它已经包含值 7,它已经替换了 5。
如果值的变化是可能的,那么它被称为可变的,这意味着 我们可以在这里改变状态。
如果不可能改变值,那么它被称为不可变的。
【讨论】:
这是状态和可变状态之间区别的最简单解释。几乎每种语言都内置了方法和函数,我们可以调用它们来做不同的事情。这些方法和函数保持自己的状态,我们可以根据我们使用的参数来操作它。不同的参数给出不同的参数(arguments)可以返回不同的值。现在,假设我们创建了一个构造函数(JavaScript)来存储我们自己的状态。然后我们编写一个函数来根据用户输入操作状态,并且在我们编写它之后我们不会更改参数,即使它被调用。但是可以使用 setState 更改 state 内部的内容,从而在不更改参数的情况下从同一个函数进行无休止的更改。
【讨论】:
状态数据是静态的。 IE。超级卡。可变数据更像是二进制组装的人工运动范式。 QED -Bryan Meluch Purdue 1997 [verb.atim] 网络
【讨论】: