¿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?