在计算机科学中,函数式编程是一种将计算作为数学函数的评价,避免状态和可变数据的编程范式。
programming
有人能解释一下什么是状态和可变数据吗?有人能用JAVA或JavaScript给我举例子吗?
发布于 2013-04-27 12:57:43
可变表示任何可以更改的内容,即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"State是类的实例将拥有的东西(对象)。
如果一个对象的属性有某些值,它处于不同的状态,那么同一类的另一个对象具有不同的属性值。
发布于 2013-04-27 15:39:42
可变状态是所有可以使函数返回不同值的东西,尽管使用相同的参数调用它。
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()调用或一般不纯函数的程序的人来说,这是一场噩梦。通常情况下,这个程序似乎是有效的,但偶尔会出现错误的结果。除非该函数有明确的文档记录或源代码可用,否则很难跟踪该bug。
在这种情况下,据说函数的行为取决于可变状态。这种状态可以被程序中完全不相关的部分更改(变异),或者像在示例中那样被另一个程序(操作系统)所改变。
发布于 2013-04-27 12:54:19
不可变对象的一个典型示例是Java String类的实例。
String s = “ABC”;
s.toLowerCase();
System.out.println(s);输出= ABC
这是因为s继续引用其不可变字符串。如果您想变异s,则需要一种不同的方法:
s = s.toLowerCase();这将创建一个新的引用。现在,字符串引用一个包含"abc“的新String对象。
https://stackoverflow.com/questions/16252238
复制相似问题