Есть ли такая вещь, как умножение короткого замыкания? - PullRequest
7 голосов
/ 16 ноября 2011

Все мы знаем о коротком замыкании в логических выражениях, т.е. когда

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

не беспокоит выполнение myFunc(), потому что условие if не может быть истинным.

Мне было любопытно, есть ли эквивалент для вашего повседневного алгебраического уравнения, скажем,

result = C*x/y + z

Если C=0, то нет смысла оценивать первый член. С точки зрения производительности не было бы большого значения, если бы x и y были скалярами, но если мы притворимся, что это большие матрицы, а операции являются дорогостоящими (и применимыми к матрицам), то, несомненно, это будет иметь значение. Конечно, вы можете избежать такого крайнего случая, добавив оператор if C!=0.

Так что мой вопрос в том, существует ли такая функция и полезна ли она. Я не очень программист, так что, вероятно, это происходит под каким-то именем, с которым я не сталкивался; если так, пожалуйста, просветите меня :)

Ответы [ 2 ]

6 голосов
/ 16 ноября 2011

Концепция, о которой вы говорите, называется под разными именами: ленивая оценка , не строгая оценка , вызов по необходимости , чтобы назвать несколько, и это на самом деле гораздо мощнее, чем просто избегать умножения здесь и там.

Существуют языки программирования, такие как Haskell или Frege , модель оценки которых не является строгой. Там было бы довольно просто написать свой оператор умножения «короткое замыкание», например, вы могли бы написать что-то вроде:

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
1 голос
/ 16 ноября 2011

Если данные большие и / или сложные и операции являются дорогостоящими, то выполнение операции должно выполнять соответствующие быстрые проверки перед выполнением дорогостоящей операции.Это внутренняя деталь реализации оператора (скажем, матрицы *), но на самом деле она не имеет ничего общего с языковой концепцией «умножения» и не должна иметь большого влияния на то, как вы пишете свои вычисления.

...