纯函数可以调用外部函数吗?
Can a pure function call external function?
纯函数可以调用外部方法吗?
例如:
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
吗?
是的,很纯粹。它不会改变任何全局状态,也不会为相同的输入给出不同的结果。
什么时候可以
纯 f
函数可以调用任何其他 function/method g0...gn
。
但是 g0...gn
也必须是 纯的 。
当你不能
一旦您获得纯函数 f
并从 f
中调用 非纯 函数 g
,然后 f
不再纯粹
在你给出的具体情况下,是的。但是你有一个方法,方法需要格外小心。
对于任何给定的输入,纯函数总是给出相同的结果,无论当前程序状态如何。方法可以被视为将其对象作为隐藏参数传递的函数。纯粹而言,该方法不得访问任何隐式状态(也不能调用任何其他易受隐式状态影响的 methods/functions )。这也意味着不使用任何包含隐式状态的对象字段。希望评论讨论给出了一个如何判断上下文的例子。
仅仅避开可变字段是不够的 - 不可变字段字段中的值必须是 knowable/predictable 。例如,如果一个对象包含一个不可变的私有字段,它在对象创建时被赋予一个随机数,那么任何使用该值来计算它的输出的方法都是不纯的。
另一方面,如果你的 Dog class 有一个在对象创建时设置的不可变名称字段,那么使用该字段的方法可以被认为是纯方法(除非其他东西使它们不合格)。
编辑
说 "side effect" 和 "purity" 是上下文相关的(如评论中所讨论的)会很有帮助。这就是我没有通过使用 "knowable" 和 "predictable" 这两个词完全清楚地暗示的内容。评论讨论说明了了解上下文的重要性。
纯函数可以调用外部方法吗?
例如:
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
吗?
是的,很纯粹。它不会改变任何全局状态,也不会为相同的输入给出不同的结果。
什么时候可以
纯 f
函数可以调用任何其他 function/method g0...gn
。
但是 g0...gn
也必须是 纯的 。
当你不能
一旦您获得纯函数 f
并从 f
中调用 非纯 函数 g
,然后 f
不再纯粹
在你给出的具体情况下,是的。但是你有一个方法,方法需要格外小心。
对于任何给定的输入,纯函数总是给出相同的结果,无论当前程序状态如何。方法可以被视为将其对象作为隐藏参数传递的函数。纯粹而言,该方法不得访问任何隐式状态(也不能调用任何其他易受隐式状态影响的 methods/functions )。这也意味着不使用任何包含隐式状态的对象字段。希望评论讨论给出了一个如何判断上下文的例子。
仅仅避开可变字段是不够的 - 不可变字段字段中的值必须是 knowable/predictable 。例如,如果一个对象包含一个不可变的私有字段,它在对象创建时被赋予一个随机数,那么任何使用该值来计算它的输出的方法都是不纯的。
另一方面,如果你的 Dog class 有一个在对象创建时设置的不可变名称字段,那么使用该字段的方法可以被认为是纯方法(除非其他东西使它们不合格)。
编辑
说 "side effect" 和 "purity" 是上下文相关的(如评论中所讨论的)会很有帮助。这就是我没有通过使用 "knowable" 和 "predictable" 这两个词完全清楚地暗示的内容。评论讨论说明了了解上下文的重要性。