在计算机科学中,函数式编程是一种编程范式 将计算视为数学函数的评估 并避免状态和可变数据。
http://en.wikipedia.org/wiki/Functional_programming
任何人都可以解释一下状态和可变数据是什么吗?任何人都可以给我JAVA或JavaScript的例子。
答案 0 :(得分:6)
State指的是存储在对象中的数据,用于确定对象的当前属性。例如,如果您有BankAccount
个对象,则该帐户的所有者及其中的金额代表该帐户的州。
然而,并非所有状态都不适合函数式编程,只有 mutable + 之一是不可接受的。例如,组成字符串的字符是字符串的状态。如果您无法更改字符串的内容,则称其具有不可变状态。这非常适合函数式编程范例。
<小时/> + mutable 是“多变的”这个奇特的词。
答案 1 :(得分: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"
状态是类的实例将具有的东西(对象)。
如果一个Object的属性具有某些值,则它处于不同的状态,那么具有不同属性值的同一个类的另一个对象
答案 2 :(得分: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()或不纯函数的调用的程序的人来说,这是一场噩梦。通常,该计划似乎有效,但偶尔会出现错误的结果。除非功能明确记录或源代码可用,否则很难跟踪错误。
在这种情况下,据说功能的行为取决于可变状态。这是可以由程序的完全不相关的部分更改(变异)的状态,或者,如示例中的另一个程序(操作系统)。
答案 3 :(得分:2)
不可变对象的典型示例是Java String类的实例。
String s = “ABC”;
s.toLowerCase();
System.out.println(s);
输出= ABC
这是因为s继续引用其不可变的String。如果你想改变s,需要采用不同的方法:
s = s.toLowerCase();
这将创建 新 引用。现在,String引用了一个包含“ abc ”的新String对象。
答案 4 :(得分:1)
假设 int i = 5;
现在变量i的状态是,现在它包含值5。
现在假设我设置了i = 7;
现在变量i的状态是,现在它包含值7,它已经取代了5。
如果可以改变值,那么它被称为as-mutable意味着 我们可以在这里改变状态。
如果无法更改值,则将其称为“不可变”。
答案 5 :(得分:0)
这是状态和可变状态之间差异的最简单解释。几乎每种语言都有内置的方法和函数,我们可以调用它们来做不同的事情。这些方法和函数保持其自己的状态,我们可以根据所使用的参数来对其进行操作。不同的参数赋予不同的参数(参数)可以返回不同的值。现在,假设我们制作了一个构造函数(JavaScript)以存储我们自己的状态。然后,我们编写一个基于用户输入来操纵状态的函数,并且在编写完该函数后,即使调用它,我们也不会更改参数。但是可以使用setState更改内部状态的内容,从而无需更改参数即可对同一函数进行无休止的更改。
答案 6 :(得分:-1)
状态数据是静态的。即超级卡。可变数据更类似于二进制组装的人工运动范例。 QED -Bryan Meluch Purdue 1997 [verb.atim] Web