Существует ли такая вещь, как умножение коротких замыканий?

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

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" и не должна иметь большого влияния на то, как вы пишете свои вычисления.