Haskell ленив, и, как правило, нет никакой гарантии, какая операция будет выполнена первой
Не совсем.Haskell имеет значение pure (кроме unsafePerformIO
и реализации IO
), и нет способа наблюдать , какая операция будет выполняться первой (за исключением unsafePerformIO
иреализация IO
).Порядок выполнения просто не имеет значения для результата.
&&
имеет таблицу истинности с 9 значениями, включая случаи, когда один или оба аргумента равны undefined
, и онточно определяет операцию:
a b a && b
True True True
True False False
True undefined undefined
False True False
False False False
False undefined False
undefined True undefined
undefined False undefined
undefined undefined undefined
Пока реализация следует этой таблице, она может выполнять вещи в любом порядке.
(Если вы изучите таблицу, выобратите внимание, что у последовательной реализации нет способа следовать ей, если только сначала не выполняется a
, затем b
, если a
- True. Но реализации на Haskell не обязательно должны быть последовательными!всегда позволял запускать b
всякий раз, когда он этого хочет, ваша единственная гарантия состоит в том, что, согласно таблице, результат выполнения b
может повлиять на вашу программу только тогда, когда a
имеет значение True.)
(Обратите внимание, что «лень» - это единственный способ написать функцию с таблицей истинности, подобной приведенной выше, на языке, подобном C или ML, все пять из liЕсли значение undefined
в любом аргументе будет принудительным, в результате будет получено значение undefined
, где в Haskell (и в C, поскольку &&
встроен в язык C) одна из строк может иметь False
в качестверезультат вместо этого.)