11

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

例如:

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

4

3 回答 3

16

当你可以

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

当你不能

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

于 2016-09-14T19:12:39.000 回答
0

在你给出的具体情况下,是的。但是您所拥有的是一种方法,并且方法需要格外小心。

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

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

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

编辑

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

于 2016-09-14T21:18:15.383 回答
0

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

于 2016-09-14T19:02:29.337 回答