La evaluación diferida es una propiedad común de los lenguajes de programación puramente funcionales para 'recuperar el rendimiento', funciona bastante simple, solo evalúa una expresión una vez que la necesita. Por ejemplo, considere en Haskell
if x == 1 then x + 3 else x + 2
En estricta evaluación (ansioso), si x hecho, es igual a dos, entonces x + 3 se evalúa y devueltos, de lo x + 2, en Haskell, tal cosa sucede, x + 3 está simplemente compuesto a la expresión, por ejemplo, decir que tengo:
let x = if x == 1 then x + 3 else x + 2
Bueno, entonces tienda que en una variable, pero lo que si nunca siempre siempre siempre uso esa variable debido a algunas otras condicionales hmm? Perdí una suma entera muy costosa en mi CPU para nada. (está bien, en la práctica no ganas en esto pero obtienes la idea con expresiones más grandes)
Entonces la pregunta es inútil, ¿por qué no son todos lenguajes lazy ?, bueno, la simple razón es que en puramente lenguajes funcionales, se garantiza que las expresiones no tendrán ningún efecto secundario. Si lo hubieran hecho, tendríamos que evaluarlos en el orden correcto. Es por eso que en la mayoría de los idiomas son evaluados con entusiasmo. En los idiomas en los que las expresiones no tienen ningún efecto secundario, no hay riesgo en la evaluación perezosa, por lo que es una opción lógica recuperar el rendimiento que tienden a perder en otras áreas.
Otro efecto secundario interesante es que if-then-else en Haskell es realmente una función del tipo Bool -> a -> a -> a
. En Haskell esto significa que toma un argumento del tipo Boolean, otro del tipo any, otro del mismo tipo que el primero, y devuelve ese tipo nuevamente. No se encuentra con una evaluación infinita de diferentes ramas de control porque los valores se evalúan solo cuando son necesarios, lo que generalmente ocurre al final del programa cuando se ha compuesto una expresión enorme y luego se evalúa para el resultado final, descartando todas las cosas que el compilador cree que no son necesarias para el resultado final. Por ejemplo, si divido una expresión enormemente compleja por sí misma, solo se puede sustituir por '1' sin evaluar ambas partes.
La diferencia es visible en el esquema, que es tradicionalmente estrictamente evaluado, pero hay una variante perezoso llamado Lazy Esquema, en el Esquema (display (apply if (> x y) "x is larger than y" "x is not larger than y"))
es un error porque if
no es una función, que es una sintaxis especializada (aunque algunos dicen sintaxis es no es especial en Scheme) ya que no necesariamente evalúa todos sus argumentos, de lo contrario nos quedaríamos sin memoria si intentáramos calcular un factorial, por ejemplo. En Lazy Scheme eso funciona bien porque ninguno de esos argumentos se evalúa en absoluto hasta que una función realmente necesita el resultado para que la evaluación continúe, como mostrar.
¿Un comentario para el voto abajo? – Earlz
Aquí hace muchas preguntas diferentes: 1) ventajas de la evaluación perezosa, 2) rendimiento, 3) cómo se implementa. Recomiendo dividirlos en 3 preguntas separadas. – Juliet