Существует ли такая вещь, как умножение коротких замыканий?
Мы все знаем о коротком замыкании в логических выражениях, т.е. когда
if ( False AND myFunc(a) ) then
...
не требует выполнения myFunc()
, потому что условие if
не может быть истинным.
Мне было любопытно, есть ли эквивалент для вашего повседневного алгебраического уравнения, скажем
result = C*x/y + z
Если C=0
нет смысла оценивать первый член. Неважно, если бы x
и y
были скалярами, но если мы притворимся, что они большие матрицы, а операции являются дорогостоящими (и применимы к матрицам), то, несомненно, это будет иметь значение. Конечно, вы могли бы избежать такого крайнего случая, указав инструкцию if C!=0
.
Итак, мой вопрос в том, существует ли такая функция, и если она полезна. Я не очень программист, поэтому, возможно, под каким-то именем я не сталкивался; если да, пожалуйста, просветите меня:)
Ответы
Ответ 1
Концепция, о которой вы говорите, подпадает под разные имена: ленивая оценка, нестрогая оценка, вызов по необходимости, чтобы назвать несколько и на самом деле намного мощнее, чем просто избегать размножения здесь и там.
Существуют языки программирования, такие как 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
Ответ 2
Если данные являются большими и/или сложными, а операции являются дорогостоящими, то реализация операции должна выполнять соответствующие проверки ярлыков перед выполнением дорогостоящей операции. Это внутренняя деталь реализации оператора (скажем, матрица *), но на самом деле не имеет ничего общего с концепцией языка "multiply" и не должна иметь большого влияния на то, как вы пишете свои вычисления.