Introduccion A La Programacion Funcional
Introduccion A La Programacion Funcional
Introducción a la materia
1er cuatrimestre de 2024
Departamento de Computación
Facultad de Ciencias Exactas y Naturales
Universidad de Buenos Aires
1
Presentación de la materia
2
Docentes
3
Dı́as y horarios de cursada
4
Modalidad de evaluación
Parciales
I Primer parcial martes 21 de mayo
I Segundo parcial viernes 5 de julio
I Recuperatorio del primer parcial martes 16 de julio
I Recuperatorio del segundo parcial martes 23 de julio
Trabajos prácticos
I TP 1 (con su recuperatorio)
I TP 2 (con su recuperatorio)
Examen final
(La materia no es promocionable).
5
Vı́as de comunicación
Docentes → alumnxs
Avisos a través del campus.
Alumnxs → docentes
Lista de correo: [email protected]
(para consultas administrativas)
6
Contenidos
programación
semántica implementación
7
Cronograma
8
Motivación: programación
Los lenguajes de programación tienen distintas caracterı́sticas.
I Etiquetado dinámico vs. tipado estático.
I Administración manual vs. automática de memoria.
I Funciones de primer orden vs. funciones de orden superior.
I Mutabilidad vs. inmutabilidad.
I Alcance dinámico vs. estático.
I Resolución de nombres temprana vs. tardı́a.
I Inferencia de tipos.
I Determinismo vs. no determinismo.
I Pasaje de parámetros por copia o por referencia.
I Evaluación estricta (por valor) o diferida (por necesidad).
I Tipos de datos inductivos, co-inductivos, GADTs, familias dependientes.
I Pattern matching, unificación.
I Polimorfismo paramétrico.
I Subclasificación, polimorfismo de subtipos, herencia simple vs. múltiple.
I Estructuras de control no local.
I ...
9
Motivación: programación
Distintas caracterı́sticas permiten abordar un mismo problema de
distintas maneras.
CMXXIV 924
+ MCXLI + 1141
r := 1
while n > 0 {
r := r * n foldl (*) 1 [1..n]
n := n - 1
}
10
Motivación: semántica
11
Motivación: semántica
Objetivo
I Probar teoremas sobre el comportamiento de los programas.
I ¿Cómo darle significado matemático a los programas?
I En AED vimos una manera de hacerlo (triplas de Hoare).
I En PLP veremos otras maneras de dar semántica.
12
Motivación: implementación
13
Bibliografı́a (no exhaustiva)
Lógica proposicional y de primer orden
Logic and Structure
D. van Dalen.
Semántica y fundamentos de la implementación
Introduction to the Theory of Programming Languages
J.-J. Lévy, G. Dowek. Springer, 2010.
Types and Programming Languages
B. Pierce. The MIT Press, 2002.
Programación funcional
Introduction to Functional Programming using Haskell
R. Bird. Prentice Hall, 1998.
Programación lógica
Logic Programming with Prolog
M. Bramer. Springer-Verlag, 2013.
Programación orientada a objetos
Smalltalk-80 the Language and its Implementation
A. Goldberg, D. Robson. Addison-Wesley, 1983.
14
Presentación de la materia
15
Programación funcional
Un problema central en computación es el de procesar información:
pregunta respuesta
O
modelado interpretación
cómputo
programa + entrada / salida
17
Expresiones
Las expresiones son secuencias de sı́mbolos que sirven para
representar datos, funciones y funciones aplicadas a los datos.
(Recordemos: las funciones también son datos).
f x y ≡ (f x) y ≡ f (x y)
Z
f a b c d ≡ (((f a) b) c) d
Ejemplo
[1, 2]
≡ 1 : [2]
≡ (:) 1 [2]
≡ ((:) 1) [2]
≡ ((:) 1) (2 : [])
≡ ((:) 1) ((:) 2 [])
≡ ((:) 1) (((:) 2) [])
19
Expresiones
Ejemplo
sumarUno = (+) 1
sumarUno (sumarUno 5)
= ((+) 1) (sumarUno 5)
≡ 1 + sumarUno 5
= 1 + ((+) 1) 5
≡ 1 + (1 + 5)
= 1 + 6
= 7
20
Tipos
1,,2 )f x(
21
Tipos
99 :: Int
not :: Bool -> Bool
not True :: Bool
(+) :: Int -> (Int -> Int)
(+) 1 :: Int -> Int
((+) 1) 2 :: Int
22
Tipos
Condiciones de tipado
Para que un programa esté bien tipado:
1. Todas las expresiones deben tener tipo.
2. Cada variable se debe usar siempre con un mismo tipo.
3. Los dos lados de una ecuación deben tener el mismo tipo.
4. El argumento de una función debe tener el tipo del dominio.
5. El resultado de una función debe tener el tipo del codominio.
f :: a -> b x :: a
f x :: b
Sólo tienen sentido los programas bien tipados.
23
Tipos
Ejemplo
suma4 :: Int -> Int -> Int -> Int -> Int
suma4 a b c d = a + b + c + d
Se puede pensar ası́:
suma4 :: Int -> (Int -> (Int -> (Int -> Int)))
(((suma4 a) b) c) d = a + b + c + d
24
Polimorfismo
Hay expresiones que tienen más de un tipo.
Usamos variables de tipo a, b, c para denotar tipos desconocidos:
id :: a -> a
[] :: [a]
(:) :: a -> [a] -> [a]
fst :: (a, b) -> a
snd :: (a, b) -> b
Ejemplo
flip f x y = f y x
¿Qué tipo tiene flip?
Expresiones Valores
3 + 2
5
5
(+)
+
id (+)
26
Modelo de cómputo
27
Modelo de cómputo
El lado izquierdo de una ecuación no es una expresión arbitraria.
Debe ser una función aplicada a patrones.
Ejemplo
¿Cuáles ecuaciones están sintácticamente bien formadas?
sumaPrimeros (x : y : z : _) = x + y + z
predecesor (n + 1) = n
iguales x x = True
28
Modelo de cómputo
Evaluar una expresión consiste en:
1. Buscar la subexpresión más externa que coincida con el lado
izquierdo de una ecuación.
2. Reemplazar la subexpresión que coincide con el lado izquierdo
de la ecuación por la expresión correspondiente al lado
derecho.
3. Continuar evaluando la expresión resultante.
30
Modelo de cómputo
Ejemplo: indefinición — error
head :: [a] -> a
head (x : _) = x
head (head [[], [1], [1, 1]]) head []
⊥
31
Modelo de cómputo
32
Modelo de cómputo
Ejemplo: listas infinitas
desde :: Int -> [Int]
desde n = n : desde (n + 1)
desde 0
0 : desde 1
0 : (1 : desde 2)
0 : (1 : (2 : desde 3)) ...
33
Modelo de cómputo
34
Funciones de orden superior
35
Funciones de orden superior
¿Qué tienen en común las siguientes funciones?
dobleL :: [Float] -> [Float]
dobleL [] = []
dobleL (x : xs) = x * 2 : dobleL xs
36
Funciones de orden superior
37
Funciones de orden superior
¿Qué relación hay entre las siguientes funciones?
suma :: Int -> Int -> Int
suma x y = x + y
38
Funciones de orden superior
¿Qué relación hay entre las siguientes funciones?
negativos :: [Int] -> [Int]
negativos [] = []
negativos (x : xs) = if x < 0
then x : negativos xs
else negativos xs
noVacias :: [[a]] -> [[a]]
noVacias [] = []
noVacias (x : xs) = if not (null x)
then x : noVacias xs
else noVacias xs
Ambas siguen el esquema:
g [] = []
g (x : xs) = if p x
then x : g xs
else g xs
39
Funciones de orden superior
40
Ejercicio
merge :: (a -> a -> Bool) -> [a] -> [a] -> [a]
mergesort :: (a -> a -> Bool) -> [a] -> [a]
El primer parámetro es una función que determina una relación de
orden total entre los elementos de tipo a.
41
¿ ¿ ¿ ¿¿ ¿¿ ¿ ¿? ? ? ? ? ? ? ? ?
42
Comentarios: tipos
Ojo. Dijimos:
43