18/11/2010 Introducción a la Programación Funci…
Índice General
1 Objetivos
2 Evaluación
3 Bibliografía
4 Recursos locales:
5 Sobre paradigmas de Programación
6 Sobre paradigmas de Programación (2)
7 Programación Funcional
8 Expresiones
9 Ejemplos
10 Evaluación de expresiones
11 Lenguajes Funcionales
12 Expresiones en Lenguajes Imperativos
13 Qué tiene de bueno la PF?
14 Transparencia referencial.
15 Lógicas de Programación
16 El lenguaje Haskell
17 Propiedades de Haskell
18 Propiedades de Haskell(2)
19 Algunos ejemplos
20 Ejemplos
21 Ejemplos. Factorial
22 Ejemplos: Factorial (2)
23 Otros ejemplos
24 La mochila del haskellero
1 Objetivos
Introducir los conceptos básicos de la Programación Funcional usando Haskell como lenguaje de
programación.
Docente: Guillermo Calderón
Créditos: 7
Cupo: no hay
Duración: 7 semanas
2 Evaluación
1. 2 tareas obligatorias
2. Evaluación escrita
Fechas aproximadas:
Tarea 1: semana 3 (2 semanas)
fing.edu.uy/inco/cursos/…/uno.html 1/8
18/11/2010 Introducción a la Programación Funci…
Tarea 2: semana 4 (2 semanas)
Escrito: última semana
3 Bibliografía
Haskell. The Craft of Functional Programming
Second Edition. Simon Thompson
Addison-Wesley, ISBN 0-201-34275-8
http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e/
A Gentle Introduction to Haskell.
Paul Hudak, John Peterson y Joseph H. Fasel.
http://www.haskell.org/tutorial/
Sitio web de Haskell: http://haskell.org
FAQ de Programación Funcional: http://www.cs.nott.ac.uk/~gmh/faq.html
4 Recursos locales:
web: http://www.fing.edu.uy/inco/cursos/progfunc
grupo de noticias: news://news.fing.edu.uy/fing.cursos.progfunc
5 Sobre paradigmas de Programación
Programación Imperativa:
programa: secuencia de instrucciones a ser ejecutadas por la máquina.
asignación: es la instrucción más simple que cambia el valor de una variable.
Instrucciones de control: selección, repetición.
Ejemplos: Pascal, Modula2, C, Java, Perl
6 Sobre paradigmas de Programación (2)
Programación Declarativa:
programa: especificación del problema a resolver
variables lógicas, no hay asignación, las variables no varían.
recursión en lugar de repetición
lenguaje lógico y matemático
Ejemplos: SQL, XSLT, prolog, lisp, ml, haskell
7 Programación Funcional
Modelo funcional Un programa funcional es un conjunto de declaraciones de funciones.
ejecución = evaluación de expresiones
fing.edu.uy/inco/cursos/…/uno.html 2/8
18/11/2010 Introducción a la Programación Funci…
expresión --> valor
Una máquina funcional actúa como una calculadora:
Ingresar definiciones de funciones
Evaluar expresiones
8 Expresiones
Cómo se construyen expresiones?
Constantes:
True, 123, 'a'
Aplicación:
f e_1 e_2 ...e_k
Donde f es una función y e_1 ... e_k son expresiones.
9 Ejemplos
Definición de funciones:
doble x = 2 * x
cuad x = x * x
doblecuad x = doble (cuad x)
Expresiones:
2 + doble 8
doble (cuad (9 + 1))
cuad (doble (3 - 1))
10 Evaluación de expresiones
Se sustituye una subexpresión por otra más *reducida*
doble (cuad (9 + 1)) =
doble (cuad (9 + 1)) =
2 * (cuad (9 + 1)) =
2 * (cuad 10) =
2 * (10 * 10) =
2 * 100 = 200
la evaluación puede diferir según cuál subexpresión se elija para reducir.
fing.edu.uy/inco/cursos/…/uno.html 3/8
18/11/2010 Introducción a la Programación Funci…
11 Lenguajes Funcionales
Definiciónes tomadas de news:comp.lang.functional
Programación Funcional: es un estilo de programación que enfatiza la evaluación de expresiones, en lugar
de la ejecución de comandos. Las expresiones en estos lenguajes se forman utilizando funciones para
combinar valores básicos.
Lenguaje Funcional: es un lenguaje que soporta e incentiva la programación en un estilo funcional.
12 Expresiones en Lenguajes Imperativos
Lenguaje C Los comandos y las instrucciones se mezclan:
c++ == (x + y)
(c = getc()) != 'o'
en general todo comando retorna un valor y produce algún efecto lateral
Lenguaje Pascal Expresiones e instrucciones son disjuntos. Sin embargo una función puede tener efectos
laterales:
f(x)+ x
x + f(x)
13 Qué tiene de bueno la PF?
Algunas propiedades buenas de los lenguajes funcionales:
Brevedad. Los programas son mas cortos y concisos
Más fáciles de entender (corregir y mantener)
Fuertemente tipado (no hay core dumps)
Reusabilidad (polimorfismo, alto orden)
Abstracción (TADs, clases, módulos)
Manejo dinámico de memoria (no hay punteros, new, etc)
Más fácil razonar formalmente acerca de los programas
14 Transparencia referencial.
Remplazar una subexpresión por otra subexpresión igual no altera el valor de una expresión
Sea la expresion:
fing.edu.uy/inco/cursos/…/uno.html 4/8
18/11/2010 Introducción a la Programación Funci…
f(x + (cuad 2))
Sabemos que
cuad 2 = doble 2
entonces
f(x + (cuad 2)) = f(x + (doble 2))
Esta propiedad no la cumplen los lenguajes imperativos.
15 Lógicas de Programación
Programación Imperativa Lógica de Hoare-Dijkstra, transformación de predicados. Compleja debido a
los efectos laterales y ejecución secuencial.
Programación Funcional Cálculo Lambda, Teoría de Tipos. Logica ecuacional.
Los programas funcionales permiten demostrar su correctitud más fácilmente.
16 El lenguaje Haskell
Haskell B. Curry (1900-1982). Lógico matemático creador de la lógica combinatoria y el lambda cálculo
tipado.
Lenguaje Haskell: Creado en 1987 por un comité integrado por varios grupos de investigación.
Estándar como lenguaje no estricto y puramente funcional.
Haskell 98 es la última versión del lenguaje.
17 Propiedades de Haskell
De lenguajes anteriores:
Funciones de alto orden.
Inferencia de tipos
Polimorfismo paramétrico
Semántica no estricta, evaluación perezosa
Listas por comprensión
18 Propiedades de Haskell(2)
Propiedades nuevas
Clases de tipos, overloading.
Entrada/salida funcional.
fing.edu.uy/inco/cursos/…/uno.html 5/8
18/11/2010 Introducción a la Programación Funci…
Soporte para mónadas
19 Algunos ejemplos
quicksort en C
qsort( a, lo, hi ) int a[], hi, lo;
{
int h, l, p, t;
if (lo < hi) {
l = lo;
h = hi;
p = a[hi];
do {
while ((l < h) && (a[l] <= p))
l = l+1;
while ((h > l) && (a[h] >= p))
h = h-1;
if (l < h) {
t = a[l];
a[l] = a[h];
a[h] = t;
}
} while (l < h);
t = a[l];
a[l] = a[hi];
a[hi] = t;
qsort( a, lo, l-1 );
qsort( a, l+1, hi );
}
}
20 Ejemplos
quicksort en Haskell
qsort [] = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
where
elts_lt_x = [y | y <- xs, y < x]
elts_greq_x = [y | y <- xs, y >= x]
21 Ejemplos. Factorial
Pascalero
fing.edu.uy/inco/cursos/…/uno.html 6/8
18/11/2010 Introducción a la Programación Funci…
fac n = if n == 0
then 1
else n * fac (n-1)
Haskellero junior
fac 0 = 1
fac (n+1) = (n+1) * fac n
Haskellero senior
fac n = foldr (*) 1 [1..n]
22 Ejemplos: Factorial (2)
Haskellero fundamentalista
fac = product . enumFromTo 1
Ver http://www.willamette.edu/~fruehr/haskell/evolution.html (The Evolution of a Haskell Programmer)
23 Otros ejemplos
Dado un texto obtener una lista ordenada de todas palabras que comienzan con vocal:
palVocal = unlines . sort .
filter (flip elem "aeiou" . head) .
words
Eliminar los elementos repetidos consecutivos de una lista
noDup = map head . group
Otra versión:
noDup xs = [ x | (x,y) <- zip xs (tail xs), x!=y]
24 La mochila del haskellero
Software
Interprete Hugs: http://www.haskell.org/hugs/
Manual
Haskell-98 Language and Libraries: http://haskell.org/definition/
Referencias y cartillas:
Haskell Reference: http://zvon.org/other/haskell/Outputglobal/index.html
A Tour of the Haskell Prelude http://www.cs.uu.nl/~afie/haskell/tourofprelude.html
fing.edu.uy/inco/cursos/…/uno.html 7/8
18/11/2010 Introducción a la Programación Funci…
Errores en hugs http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e/errors/allErrors.html
fing.edu.uy/inco/cursos/…/uno.html 8/8