Следующие
(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True
имеет желаемое свойство короткого замыкания False && undefined ≡ False
. Первое предложение, которое является нестрогим в правильном аргументе, гарантированно проверяется прежде, чем что-либо еще будет проверено.
По-видимому, он все еще работает, если я изменяю порядок и даже не выполняю функции
both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False
Prelude> both (False, undefined)
False
но действительно ли это гарантировано стандартом? В отличие от порядка предложений, порядок оценки шаблонов здесь не столь ясен. Могу ли я быть уверенным, что сопоставление (True,False)
будет отменено, как только будет определено (False,_)
, прежде чем элемент snd будет вообще оценен?