8

在计算机科学中,函数式编程是一种编程范式,它将计算视为对数学函数的评估,并避免了状态和可变数据。

http://en.wikipedia.org/wiki/Functional_programming

谁能解释一下什么是状态和可变数据?谁能给我 JAVA 或 JavaScript 的例子。

4

7 回答 7

6

状态统指对象中存储的决定对象当前属性的数据。例如,如果您有一个BankAccount对象,则该帐户的所有者和其中的金额表示该帐户的状态

但是,并非所有状态都对函数式编程不利,只有可变+ 1 是不可接受的。例如,组成字符串的字符就是该字符串的状态。如果您无法更改字符串的内容,则称它具有不可变状态。这非常适合函数式编程范式。


+ mutable是“可变”的一个花哨的词。

于 2013-04-27T12:52:47.233 回答
6

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"

状态是类的实例将具有的东西(对象)。

如果一个对象的属性具有某些值,则其处于不同状态,则同一类的另一个对象具有不同的属性值

于 2013-04-27T12:57:43.463 回答
3

可变状态是可以使函数返回不同值的一切,尽管它是用相同的参数调用的。

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() 或不纯函数的调用的程序的人来说,这通常是一场噩梦。通常,该程序似乎有效,但有时会提供错误的结果。除非功能被明确记录或源代码可用,否则很难跟踪错误。

在这种情况下,据说函数的行为取决于可变状态。这种状态可以被程序的完全不相关的部分改变(变异),或者像例子中的那样,被另一个程序(操作系统)改变。

于 2013-04-27T15:39:42.050 回答
2

不可变对象的一个​​经典示例是 Java String 类的实例。

 String s = “ABC”;

 s.toLowerCase();

 System.out.println(s);

输出 = ABC

这是因为 s 继续引用它的不可变字符串。如果你想改变 s,需要一种不同的方法:

s = s.toLowerCase();

这将创建一个的参考。现在 String s 引用了一个包含“ abc ”的新 String 对象。

于 2013-04-27T12:54:19.453 回答
1

假设int i=5;

现在变量 i 的状态是 ,现在它包含值 5。

假设现在我设置了 i=7;

现在变量 i 的状态是 ,现在它包含值 7,它已经替换了 5。

如果值的改变是可能的,那么它被称为可变的,这意味着我们可以在这里改变状态。

如果无法更改值,则将其称为不可变的。

于 2013-04-27T12:51:26.063 回答
0

这是状态和可变状态之间区别的最简单解释。几乎每种语言都内置了方法和函数,我们可以调用它们来做不同的事情。这些方法和函数保持自己的状态,我们可以根据我们使用的参数来操作它。不同的参数给出不同的参数(arguments)可以返回不同的值。现在,假设我们创建了一个构造函数(JavaScript)来存储我们自己的状态。然后我们编写一个函数来根据用户输入操作状态,并且在我们编写它之后,我们不会更改参数,即使它被调用也是如此。但是可以使用 setState 更改状态内部的内容,从而在不更改参数的情况下从同一函数进行无休止的更改。

于 2020-08-10T01:07:38.237 回答
-1

状态数据是静态的。即超级卡。可变数据更像是二进制组装的人工运动范式。QED -Bryan Meluch Purdue 1997 [verb.atim] Web

于 2020-10-10T15:00:00.163 回答