You are on page 1of 4

Evaluación

perezosa
Programación funcional y lógica
Instituto Tecnológico Superior de Pánuco
Denisse Itzayana Flores Ríos
Ing. Gil Santana Esparza

Introducción.
En programación, una estructura de datos es una forma particular de organizar
datos en una computadora para que pueda ser utilizado de manera eficiente. En la
teoría de lenguajes de programación, La evaluación perezosa (del inglés lazy
evaluation) o llamada por necesidad es una estrategia de evaluación que retrasa
el cálculo de una expresión hasta que su valor sea necesario, y que también evita
repetir la evaluación en caso de ser necesaria en posteriores ocasiones. La
evaluación perezosa consiste, como siempre que hablamos de pereza, en hacer el
mínimo trabajo posible. Es decir, una expresión no se evalúa hasta que realmente
se necesita. JavaScript lo utiliza sólo puntualmente, pero hay lenguajes, como
Haskell, que lo utilizan siempre. Podemos ver la diferencia con una función que
tiene otras funciones como parámetros. Un lenguaje sin evaluación perezosa
ejecutaría las funciones func1(), func2() y func3() para obtener los parámetros
finales y después continuaría con el cuerpo de la función. En cambio un lenguaje
con evaluación perezosa empieza con el código de la función sin evaluar
previamente las tres funciones. Las irá evaluando cuando aparezcan en el código
y sean realmente necesarias. De esta forma, si un argumento no se utiliza, nunca
será evaluado.

Evaluación perezosa.
La evaluación perezosa es, según Hughes, otra “cola de pegar” que permite
ensamblar juntas piezas de un programa funcional que de otro modo serían
disjuntas. Igual que el orden superior, abstraen aspectos comunes y convierte los
aspectos específicos en parámetros, proporcionando así un modo de ensamblar
entre sí piezas independientes, la evaluación perezosa permite separar el aspecto
de la generación de los datos del aspecto de su consumo, permitiendo que una
función distinta se ocupe de cada uno de ellos.
Un símil podría aclarar qué se entiende por evaluación perezosa: una fábrica
produce muebles de cocina y una tienda dotada de un pequeño almacén los
vende. Con el fin de minimizar el inmovilizado, la fábrica solo comienza a fabricar
cuando la tienda le comunica una venta segura. A su vez, la fábrica hace su
pedido de madera, metal, vidrio, etc. Solo cuando necesita fabricar algún mueble.
Es decir, todo el proceso está dirigido por la demanda. En última instancia, el árbol
que da lugar al mueble empezaría a ser cortado a partir del momento que exista
un cliente para dicho mueble. No cabe duda de que esta organización tiene
inconvenientes pero también tiene evidentes ventajas: ninguna hora de trabajo
sería en vano, no se desperdiciaría ni un solo gramo de material y no se
necesitaría apenas un almacenaje intermedio. Sí llamamos CortarMadera, fabricar
y vender a las funciones involucradas, el proceso completo podría definirse
mediante la composición funcional de las tres.1
muebles= (vender.fabricar.CortarMadera) arboles
Donde arboles representa a la lista infinita de árboles y todas las funciones
producen listas infinitas a

partir de listas infinitas. Supongamos ahora que el

programador escribe la expresión:
Head muebles

1 La aplicación de la función compuesta f.g consiste en aplicar primero la
función g, y en aplicar después el resultado obtenido en la función f.

Donde head es la función que proporciona la cabeza de una lista. En un lenguaje
y en una fábrica

impacientes, esta llamada desataría un proceso no terminante

en poco tiempo, como los árboles del planeta. La razón es que trataría de evaluar
la lista muebles antes de llamar a head. En una fábrica y lenguajes perezosos, en
cambio, la misma llamada desencadenaría la cantidad de proceso estrictamente
necesaria, en cada una de las tres funciones, para producirse un solo mueble.
La evaluación perezosa es más complicada de implementar que la impaciente. El
computo es un constante arrancar y parar como el que es fácil imaginar en la
fábrica perezosa de muebles que hemos descrito. Sin embargo, no debemos
preocuparnos demasiado, porque eso es tarea de los compiladores. Lo que
importa es que el programador le simplifica su trabajo, ya que sabiendo que al final
de la cadena hay otra función que establece la demanda estrictamente necesaria.
Conclusión:
Entre las ventajas citadas de la evaluación perezosa están también las siguientes:

Programas que no terminan bajo la evaluación impaciente, lo hacen bajo la

evaluación perezosa.
Permite definir funciones no estrictas, es decir, funciones que pueden dar

un resultado definido aunque algunos de sus parámetros estén indefinidos.
Permite definir y utilizar estructuras de datos infinitas. Por ejemplo, se
puede utilizar la lista de todos los números primos, o la de todos los
naturales, o la de todas las potencias de diez, siempre que el cómputo
posterior solo consuma una parte finita de dichas listas.

Bibliografía:
Peña Marí Ricardo, (2008) De Euclides a Java. Historia de los algoritmos y de los
lenguajes de programación. Editorial AGT.
NOTA: Este reporte ha sido extraído del libro mencionado.