Existe alguma garantia sobre a ordem de avaliação dentro de uma correspondência de padrão?
Os seguintes
(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True
possui a propriedade de curto-circuito desejadaFalse && undefined ≡ False
. A primeira cláusula, que não é rigorosa no argumento correto, é garantida para ser verificada antes que qualquer outra coisa seja tentada.
Aparentemente, ainda funciona se eu alterar a ordem e até cancelar a função
both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False
Prelude> both (False, undefined)
False
mas isso é realmente garantido pelo padrão? Diferentemente da ordem das cláusulas, a ordem de avaliação dos padrões não é tão clara aqui. Posso realmente ter certeza de que a correspondência(True,False)
será abortado assim que(False,_)
é determinado antes de o elemento snd ser avaliado?