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?

questionAnswers(1)

yourAnswerToTheQuestion