Pregunta

Una pregunta rápida que me ha estado molestando últimamente. ¿El Haskell realizar toda la prueba de equivalencia en una función que devuelve un valor lógico, incluso si uno vuelve un valor falso?

Por ejemplo

f a b = ((a+b) == 2) && ((a*b) == 2)

Si la primera prueba devuelve falso, va a realizar la segunda prueba después de la &&? O es Haskell lo suficientemente flojo para no hacerlo y seguir adelante?

¿Fue útil?

Solución

Si se cortocircuita al igual que otros idiomas. Se define así en el Preludio:

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

Así que si el primer parámetro es el segundo Falso nunca necesita ser evaluado.

Otros consejos

Al igual que Martin dijo, idiomas con la evaluación perezosa nunca se evalúan todo lo que no se necesita inmediatamente de valor. En un lenguaje perezoso como Haskell, se obtiene un cortocircuito de forma gratuita. En la mayoría de los idiomas, el || y && y operadores similares deben ser construidos especialmente a la lengua a fin de que la evaluación de corto circuito. Sin embargo, en Haskell, evaluación perezosa que ello resulte innecesario. Se podría definir una función que cortocircuitos sí mismo, incluso:

scircuit fb sb = if fb then fb else sb

Esta función se comportará igual que la 'o' operador lógico. Aquí es cómo || se define en Haskell:

True  || _ = True
False || x = x

Por lo tanto, para darle la respuesta específica a su pregunta, no. Si el lado izquierdo de la || Es cierto, la derecha no se evalúa. Se puede poner dos y dos para los demás operadores que 'cortocircuito'.

Lazy medios de evaluación, que nada se evalúa hasta que es realmente necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top