【发布时间】:2011-01-30 16:37:50
【问题描述】:
[编辑]
一般问题似乎很难解决。这是这个问题的一个明显受限的version。
如何确定函数的相等性?
假设我们有
function f() {
// black box code.
}
function g() {
// black box code.
}
我们对函数进行数学定义。所以
if for all x in domain, f(x) === g(x) then f === g
- 我们如何处理域?
- 我们如何才能确定
f === g
通过源代码检查是愚蠢的,因为
function f(i) {
return i % 2;
}
function g(i) {
var returnVal = i % 2;
return returnVal;
}
显然是相等的。这些是微不足道的示例,但您可以想象更复杂的函数相等但源不相等。
您可以假设f 和g 没有我们关心的副作用。
[编辑]
正如@Pointy 提到的,最好限制域。与其让等式函数尝试猜测域,不如让等式函数的用户提供一个域。
如果没有在某个地方定义它们的域,就问两个函数是否相等是没有意义的。
简单来说,我们可以假设域的问题是所有整数的集合或其子集,因此我们需要一个函数:
function equal (f, g, domain) {
}
域的结构无关紧要,可以使问题尽可能简单。您还可以假设 f 和 g 在整数域上表现良好并且不会崩溃和烧毁。
您可以假设f 和g 停止!
@Pointy 再次指出了非确定性函数的一个很好的例子
如果我们将 f 和 g 限制为确定性会怎样。
【问题讨论】:
-
好吧,因为 JavaScript 允许副作用,它甚至比检查返回值更复杂。我想您可以根据需要以这种方式约束问题,但我不了解它的实际价值。
-
@Pointy 我希望将无限集建模为函数。然后操纵这些集合并进行某种相等性检查。在这种情况下,您可以假设没有副作用。
-
哦,好吧。这是一个有趣的问题;解决这个问题的一种方法是看看你是否能拿出证据证明它不可能。
-
@Pointy 我宁愿不证明我正在编写的代码行不通。我可能需要在 LISP 而不是 JavaScript 中执行此操作。
-
我并不是说证明它会很有趣 :-) 这似乎是一种思考问题的有趣方式。函数族的域是否受到任何限制?
标签: javascript function comparison equality