Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FUNCIONAL
ALUMNO: Moiss Abraham
Bautista Crdova.
PROFESOR: Ing. Csar
Manuel Hernndez Mendoza
08 DE MARZO 2015
principal
de
la
programacin
E VA LU A C I O N P E R E Z O S A
impaciente.
Evaluacin perezosa del ejemplo anterior:
Cuadrado (1+2)
= x*x con x = 1+2 [por def. cuadrado]
= 3*3 [por def. de +]
= 9 [por def. de *]
Haskell usa evaluacin perezosa.
E S T R AT E G I A D E L A E VA L U A C I N
PEREZOSA
Las estrategias de evaluacin se dividen en dos grupos bsicos, estrictos y no
estrictos, basados en cmo se manejan los argumentos de una funcin.
Una expresin que consta de una funcin aplicada a uno o ms parmetros y que
puede ser "reducida" aplicando dicha funcin la vamos a llamar Redex (Reducible
Expression).
Estrategias bsicas
Tipos
:
De adentro hacia afuera o call-by-value
De afuera hacia adentro o call-by-name
Evaluaciones que no terminan
De adentro hacia afuera o call-by-value:
esta estrategia elige el redex que est "ms adentro" entendiendo por esto al
redex que no contiene otro redex. Si existe ms de un redex que cumple dicha
condicin se elige el que est ms a la izquierda.
aplicamos el primer +
mult (3,2+3)
aplicamos el +
mult (3,5)
aplicamos mult
3*5
aplicamos *
15
Por ejemplo: mult (1+2,2+3)
Esta estrategia asegura que los parmetros de una funcin estn completamente
evaluados antes de que la funcin sea aplicada. Por eso se dice que los parmetros
se pasan por valor.
De afuera hacia adentro o call-by-name:
elige el redex que est "ms afuera" entendiendo por esto al redex que no esta
contenido en otro redex. Si existe ms de un redex que cumple dicha condicin se
elige el que est ms a la izquierda.
aplicamos mult
(1+2) * (2+3)
aplicamos el primer +
3 * (2+3)
aplicamos +
3*5
aplicamos *
15
Ejemplo: mult (1+2,2+3)
El operador * y el + no pueden ser aplicados hasta que sus dos parmetros hayan
sido evaluados a nmeros. A las funciones que cumplen con esta propiedad las
vamos a llamar funciones estrictas.
Evaluaciones que no terminan
Tengan en cuenta la siguiente definicin
inf = 1 + inf
Intentar reducir la expresin inf siempre nos va a dar como resultado una
expresin ms y ms grande (independientemente de la estrategia de evaluacin
que usemos)
inf
aplicamos inf
1 + inf
aplicamos inf (porque + es estricta)
1 + (1 + inf)
aplicamos inf (porque + es estricta)
... 1 + (1 + (1 + (1 + (1 + (1 + .... + inf )))))
Por ende, est evaluacin nunca terminara.
Sabiendo que
fst (x,_) = x
Consideremos la expresin fst (0,inf)
Usando la estrategia call-by-value
fst (0,inf)
aplicamos inf
fst (0, 1 + inf )
aplicamos inf
fst (0, 1 + (1 + inf) )
aplicamos inf
fst (0, 1 + (1 + (1 + inf) ) )
aplicamos inf
Usemos call-by-name:
fst (0,inf)
aplicamos fst
0
Si existe alguna secuencia de evaluacin que haga terminar la evaluacin de la
expresin entonces con la estrategia call-by-name tambin se termina la
evaluacin.
MAPA CONCEPTUAL