在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免了状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
谁能解释一下什么是状态和可变数据?谁能给我 JAVA 或 JavaScript 的例子。
在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免了状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
谁能解释一下什么是状态和可变数据?谁能给我 JAVA 或 JavaScript 的例子。
状态统指对象中存储的决定对象当前属性的数据。例如,如果您有一个BankAccount
对象,则该帐户的所有者和其中的金额表示该帐户的状态。
但是,并非所有状态都对函数式编程不利,只有可变+ 1 是不可接受的。例如,组成字符串的字符就是该字符串的状态。如果您无法更改字符串的内容,则称它具有不可变状态。这非常适合函数式编程范式。
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"
状态是类的实例将具有的东西(对象)。
如果一个对象的属性具有某些值,则其处于不同状态,则同一类的另一个对象具有不同的属性值
可变状态是可以使函数返回不同值的一切,尽管它是用相同的参数调用的。
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 更改状态内部的内容,从而在不更改参数的情况下从同一函数进行无休止的更改。
状态数据是静态的。即超级卡。可变数据更像是二进制组装的人工运动范式。QED -Bryan Meluch Purdue 1997 [verb.atim] Web