Вопрос

В последнее время меня беспокоит быстрый вопрос.Выполняет ли Haskell всю проверку эквивалентности в функции, которая возвращает логическое значение, даже если она возвращает ложное значение?

Например

f a b = ((a+b) == 2) && ((a*b) == 2)

Если первый тест возвращает false, будет ли он выполнять второй тест после &&?Или Haskell достаточно ленив, чтобы не делать этого и двигаться дальше?

Это было полезно?

Решение

Должно быть короткое замыкание, как и другие языки.В Прелюдии это определено следующим образом:

(&&)                    :: Bool -> Bool -> Bool
True  && x              =  x
False && _              =  False

Поэтому, если первый параметр имеет значение False, второй никогда не нужно оценивать.

Другие советы

Как сказал Мартин, языки с ленивым вычислением никогда не оценивают ничего, что не является необходимым немедленно.В ленивом языке, таком как Haskell, вы получаете короткое замыкание бесплатно.На большинстве языков || и && и аналогичные операторы должны быть построены специально в язык, чтобы они могли оценки короткого замыкания.Однако в Haskell ленивые вычисления делают это ненужным.Вы можете определить функцию, которая даже замыкает вас накоротко:

scircuit fb sb = if fb then fb else sb

Эта функция будет вести себя так же, как логический оператор «или».Вот как || определено в Хаскелле:

True  || _ = True
False || x = x

Итак, чтобы дать вам конкретный ответ на ваш вопрос: нет.Если левая сторона || Это правда, правая сторона никогда не оценивается.Вы можете сложить два и два для других операторов, которые «короткое замыкание».

Ленивая оценка означает, что ничего не оценивается до тех пор, пока это действительно не понадобится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top