Académique Documents
Professionnel Documents
Culture Documents
2 Programación Funcional
El cálculo lambda es un lenguaje funcional prototı́pico con:
1
4 Variables en Lenguajes Funcionales
La construcción let permite introducir nuevas variables
let x = e1 in e2
Esta construcción es similar a (λx.e2 )e1
La variable x es vinculada estáticamente a e1 por let en el ámbito de e2 .
Las variables son nombres de expresiones (p. ej., x es un nombre para el
valor denotado por e1 en e2 ).
La interpretación de variables como nombres de expresiones captura el sig-
nificado de let en matemáticas.
Las variables nunca se actualizan en un lenguaje funcional puro.
5 Transparencia Referencial
En programas funcionales puros, es posible razonar ecuacionalmente por sub-
stitución de iguales por iguales:
let x = e1 in e2 equivale a [e1 /x]e2
En un lenguaje imperativo, un efecto lateral en e1 podrı́a invalidar la ecuación
anterior.
El comportamiento de una función pura en un lenguaje funcional puro de-
pende solamente de los parámetros dados.
Este comportamiento es similar al de una función en matemáticas.
Esto hace más fácil entender y razonar en programas funcionales.
• recursión
2
7 Codificación de Booleanos en el Cálculo Lambda
Los booleanos sirven para tomar decisiones, regresando uno de dos posibles
resultados.
Para su codificación en el cálculo lambda, un booleano es una función tal
que dados dos argumentos selecciona uno de ellos.
true = λx.λy.x
false = λx.λy.y
not = λx.λy.x y
and = λb.λc.λx.λy.b (c x y) y
if E1 thenE2 elseE3 = E1 E2 E3
La codificación tanto de and como de if then else resultan en evaluación
corta.
Ejemplos.
and false e →∗β false
if true then u else v
= (λx.λy.x) u v
→β (λy.u) v
→β u
3
00 = λf.λx.x
10 = λf.λx.f x
20 = λf.λx.f (f x)
...
n0 = λf.λx.f n x
A ésta representación unaria de los números naturales se les llama numerales
de Church.
4
13 Codificación de la Recursión
Dado un predicado P codifica la función f ind tal que f ind P n evalúa el número
más pequeño que es más grande que n pero que satisface P :
Definamos:
F = λf.λp.λn.(p n) n (f p (succ n))
Necesitamos encontrar un punto fijo para F
f ind = F f ind
o
f ind p n = F f ind p n