【问题标题】:Can anyone explain me what is state and mutable data?谁能解释一下什么是状态和可变数据?
【发布时间】:2021-07-29 05:09:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: java javascript functional-programming immutability


    【解决方案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"
    

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

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

    【讨论】:

    • 谁能更好地解释一下? o.O
    【解决方案2】:

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

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


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

    【讨论】:

    • 你所说的“不可变状态”我称之为“价值”。
    【解决方案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() 或不纯函数的调用的程序的人来说,这通常是一场噩梦。通常,该程序似乎有效,但有时会提供错误的结果。除非函数有明确的文档或源代码可用,否则很难跟踪错误。

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

    【讨论】:

      【解决方案4】:

      不可变对象的典型示例是 Java String 类的实例。

       String s = “ABC”;
      
       s.toLowerCase();
      
       System.out.println(s);
      

      输出 = ABC

      这是因为 s 继续引用它的不可变字符串。如果要对 s 进行变异,则需要使用不同的方法:

      s = s.toLowerCase();
      

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

      【讨论】:

        【解决方案5】:

        假设 int i=5;

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

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

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

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

        如果不可能改变值,那么它被称为不可变的。

        【讨论】:

        • 在此基础上,对象的状态基于其所有字段的状态。如果对象的某个字段改变状态,那么对象状态就会改变。如果对象的字段可以改变状态,则该对象被认为是可变的。如果一个对象的字段不能改变状态(一旦对象被创建),它被认为是不可变的。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-12
          • 2016-02-02
          • 1970-01-01
          • 2021-04-07
          • 2015-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多