¿Hay alguna garantía sobre el orden de evaluación dentro de una coincidencia de patrón?

El seguimiento

(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True

tiene la propiedad de cortocircuito deseadaFalse && undefined ≡ False. La primera cláusula, que no es estricta en el argumento correcto, se garantiza que se verifique antes de intentar cualquier otra cosa.

Aparentemente, todavía funciona si cambio el orden e incluso deshago la función

both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False

Prelude> both (False, undefined)
False

pero ¿está esto realmente garantizado por el estándar? A diferencia del orden de las cláusulas, el orden de evaluación de los patrones no está tan claro aquí. ¿Puedo estar seguro de que la coincidencia(True,False) será abortado tan pronto como(False,_) se determina antes de evaluar el elemento snd?

Respuestas a la pregunta(1)

Su respuesta a la pregunta