8

我们都知道逻辑表达式中的短路,即当

if ( False AND myFunc(a) ) then
...

不打扰执行myFunc(),因为if条件不可能为真。

我很好奇你的日常代数方程是否有等价物,比如说

result = C*x/y + z

如果C=0评估第一项没有意义。如果xy是标量在性能方面并不重要,但如果我们假装它们是大型矩阵并且操作成本高昂(并且适用于矩阵),那么它肯定会有所作为。当然,您可以通过if C!=0声明来避免这种极端情况。

所以我的问题是这样的功能是否存在,是否有用。我不是一个程序员,所以它可能以我没有遇到过的名字命名;如果是这样,请赐教:)

4

2 回答 2

6

您正在谈论的概念有不同的名称:惰性求值非严格求值按需调用等等,实际上比在这里和那里避免乘法要强大得多。

HaskellFrege等编程语言的评估模型是非严格的。在那里编写您的“短路”乘法运算符将非常容易,例如您可以编写如下内容:

infixl 7 `*?`        -- tell compiler that ?* is a left associative infix operator
                     -- with precedence 7 (like the normal *)

0 *? x = 0           -- do not evaluate x
y *? x = y * x       -- fall back to standard multiplication
于 2011-11-16T11:16:37.227 回答
1

如果数据很大和/或复杂并且操作代价高昂,那么操作的实现应该在提交代价高昂的操作之前执行适当的快捷检查。它是运算符(例如,矩阵 *)实现的内部细节,但实际上与“乘法”的语言概念无关,并且对您编写计算的方式影响不大。

于 2011-11-16T03:06:47.243 回答