Есть ли какая-либо гарантия относительно порядка оценки в соответствии с шаблоном?
Следующие
(&&) :: 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 будет оценен вообще?