Cortocircuito(&&) en Haskell
boolean combinators (3)
Una pregunta rápida que me ha estado molestando últimamente. ¿Haskell realiza toda la prueba de equivalencia en una función que devuelve un valor booleano, incluso si uno devuelve un valor falso?
Por ejemplo
f a b = ((a+b) == 2) && ((a*b) == 2)
Si la primera prueba devuelve falso, ¿realizará la segunda prueba después de &&
? ¿O es Haskell lo suficientemente perezoso para no hacerlo y seguir adelante?
Como dijo Martin, los idiomas con evaluación perezosa nunca evalúan nada de valor que no sea necesario de inmediato. En un lenguaje perezoso como Haskell, obtienes corto circuito gratis. En la mayoría de los idiomas, el || y &&y operadores similares deben estar integrados especialmente en el idioma para que puedan realizar un cortocircuito en la evaluación. Sin embargo, en Haskell, la evaluación perezosa hace que esto sea innecesario. Podrías definir una función que te cortocircuite incluso:
scircuit fb sb = if fb then fb else sb
Esta función se comportará como el operador lógico ''o''. Aquí es cómo || Se define en Haskell:
True || _ = True
False || x = x
Entonces, para darte la respuesta específica a tu pregunta, no. Si el lado izquierdo de la || Es cierto, el lado derecho nunca se evalúa. Puede poner dos y dos juntos para los otros operadores que ''cortocircuitan''.
Debe ser cortocircuitado al igual que otros idiomas. Se define así en el Preludio:
(&&) :: Bool -> Bool -> Bool
True && x = x
False && _ = False
Entonces, si el primer parámetro es False, el segundo nunca necesita ser evaluado.
La evaluación perezosa significa que nada se evalúa hasta que realmente se necesita.