【问题标题】:Can a pure function call external function?纯函数可以调用外部函数吗?
【发布时间】:2017-01-22 16:34:42
【问题描述】:

纯函数可以调用外部方法吗?

例如:

class Dog {
  function jump(name) {
    return "a dog named " + name + " jumped!"
  }

  function jumpTwice(names) {
    var result = [];
    for (var i = 0; i < 2; i++) {
       result.push(jump(names[i]));
    }
    return result.join("\n");
  }

}

jumpTwice() 可以被视为pure function吗?

【问题讨论】:

    标签: function functional-programming concept pure-function


    【解决方案1】:

    什么时候可以

    f 函数可以调用任何其他函数/方法g0...gn。 但g0...gn 也必须是

    当你不能时

    一旦你得到一个纯函数f 并从f 中调用一个非纯函数g,那么f 就不再是纯函数了。

    【讨论】:

      【解决方案2】:

      是的,它是纯净的。它不会改变任何全局状态,也不会为相同的输入提供不同的结果。

      【讨论】:

        【解决方案3】:

        在你给出的具体情况下,是的。但是你有一个方法和方法需要额外的小心。

        无论当前程序状态如何,对于任何给定的输入,纯函数总是给出相同的结果。方法可以被视为函数,它们将其对象作为隐藏参数传递。纯粹的,该方法不能访问任何隐式状态(也不能调用任何其他易受隐式状态影响的方法/函数)。这也意味着不使用任何包含隐式状态的对象字段。 cmets 的讨论希望能给出一个如何判断上下文的例子。

        避开可变字段是不够的 - 不可变字段字段中的值必须是可知道/可预测的。例如,如果一个对象包含一个不可变的私有字段,该字段在创建对象时被赋予一个随机数,那么任何使用该值来计算其输出的方法都是不纯的。

        另一方面,如果您的 Dog 类有一个在创建对象时设置的不可变名称字段,那么使用该字段的方法可以被视为纯方法(除非其他东西取消了它们的资格)。

        编辑

        如果说“副作用”和“纯度”是上下文相关的(如 cmets 中所讨论的)会很有帮助。这是我没有完全清楚地使用“可知”和“可预测”这两个词来暗示的。 cmets 的讨论说明了了解上下文的重要性。

        【讨论】:

        • 我不确定您所说的“可知道/可预测”是什么意思。作为对象一部分的所有字段都有助于方法的输入。对象创建不纯(涉及随机性)并不会使方法本身不纯。
        • 如果该方法忽略了对象的有状态属性,那么它是可预测的和纯粹的。无论输入的可变部分是什么,在这种情况下,输出都是可预测的。
        • 不,创建带有隐藏随机字段的对象不是纯粹的,只有调用返回对象上的隐藏字段的方法才是。加在一起,它们显然是不纯的。
        • 是的,如果你对上下文准确,那么我承认你的观点。
        • 作为函数式 OO 的一个很好的例子,我倾向于指出 Java 中的 String 类。所有的方法都是纯的,一个实例永远不会改变它的状态。
        猜你喜欢
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2018-04-12
        • 2018-08-05
        • 1970-01-01
        相关资源
        最近更新 更多