Vous êtes sur la page 1sur 20

Bases de Lenguajes de Programacin

Tema 5. El paradigma de programacin funcional.


Bases de Lenguajes de Programacin 1

Tema 5. Paradigma funcional. INDICE:


1. 2. 3. 4. 5. 6. 7. 8. 9. Programacin funcional. Lenguaje Hope. Tipos de datos. Expresiones sencillas. Tuplas y expresiones condicionales. Recursividad. Tipos de datos definidos por el usuario. Definiciones locales. Conceptos sobre tipos de datos. Tipos de datos recursivos. Polimorfismo.
Bases de Lenguajes de Programacin 2

BIBLIOGRAFA:
R. Bailey, Functional programming with Hope, Ellis Horwood, 1989. A. J. Field, P. Harrison, Functional programming, Addison-Wesley Iberoamerica, 1988. (caps. 1, 2 y 3)

Bases de Lenguajes de Programacin

1. Programacin funcional
La programacin funcional es un paradigma de programacin. Caracterstica: aplicacin funcional (uso del concepto matemtico de funcin) como estructura de control principal. Un programa completo se escribe como una nica expresin funcional que puede incluir llamadas a funciones.
Bases de Lenguajes de Programacin 4

1. Programacin funcional
Propiedad de los programas funcionales: la transparencia referencial el resultado devuelto por una funcin slo depende de los argumentos que se le pasan en la llamada. En programacin imperativa esto no tiene porqu ser cierto debido a efectos laterales (producidos por el uso de variables globales).
Bases de Lenguajes de Programacin 6

1. Programacin funcional
Ejemplo: (Programa Pascal con efectos laterales)
program ConEfectosLat (output); var estado: boolean; function Efectos (n:integer): integer; begin if estado then Efectos := n else Efectos := 2*n+1; estado := not estado; end; (* Efectos *) begin estado := True; WriteLn (Efectos(1), , Efectos(1)); WriteLn (Efectos(2), , Efectos(2)); end. (* ConEfectosLat *)
Bases de Lenguajes de Programacin 7

1. Programacin funcional
La salida obtenida al ejecutar el programa es la siguiente: 1 2 3 5

llamadas con los mismos argumentos a la funcin Efectos producen resultados distintos! La evaluacin de un programa funcional slo depende de los argumentos que se le pasan (propiedad de transparencia referencial). => Programacin sin efectos laterales.
Bases de Lenguajes de Programacin 8

1. Programacin funcional
La programacin funcional es un tipo de programacin declarativa (diferente a la programacin imperativa). Los programas funcionales expresan mejor qu hay que calcular, y no detallan tanto cmo realizar dicho clculo (como ocurre con los programas imperativos).

Bases de Lenguajes de Programacin

1. Programacin funcional
En los programas funcionales, al igual que en los imperativos disponemos de diferentes tipos de datos predefinidos (enteros, reales, booleanos y caracteres), y de tipos de datos definidos por el programador. Estructuras de control en los programas funcionales:
1. composicin funcional, 2. construccin condicional y 3. recursividad.
Bases de Lenguajes de Programacin 10

1. Programacin funcional
El primer lenguaje funcional desarrollado fue LISP (1958), que se aplic en el rea de Inteligencia Artificial. Otros de los lenguajes funcionales son: Standard ML, Hope, Haskell, etc.

Bases de Lenguajes de Programacin

11

1. Lenguaje Hope
El lenguaje funcional Hope puede considerarse como una notacin para escribir programas en forma de expresiones funcionales. Una expresin puede estar constituida por un conjunto de smbolos bsicos como: -,+, >, (, 2, ... Los smbolos pueden ser: operadores {+, -, >,...}, operandos {x, 1, 2,...}, nombres de funciones (con sus argumentos), separadores {;}, etc. Ejemplo:
(11 + 10) (20 + 5)+ Maximo (pi, 20);
Bases de Lenguajes de Programacin 12

1. Lenguaje Hope. Prioridad


2 + 3 * 5 ; Si hay varios operadores Cmo se calcula el valor? Asignar prioridades a operadores. La operaciones con operador de ms prioridad se hacen antes.

Bases de Lenguajes de Programacin

13

1. Lenguaje Hope. Prioridad


2 + 3 * 5 ; Si hay varios operadores Cmo se calcula el valor? Asignar prioridades a operadores. La operaciones con operador de ms prioridad se hacen antes. Tabla de prioridades: PRECEDENCIA
*, div : Prioridad 6 +,- : Prioridad 5
Bases de Lenguajes de Programacin 14

1. Lenguaje Hope. Prioridad


Si hay varios operadores con igual precedencia 2 + 3 - 5 ; Se da prioridad al operador que se encuentra ms a la izquierda.
ASOCIATIVIDAD

HOPE tiene asociatividad por la izquierda.


Bases de Lenguajes de Programacin 16

1. Lenguaje Hope. Prioridad


Ejemplos: Expresin(E): 2 + 3 * 4; Resultado(R): 14 (E): (2 + 3) * 4; (R): 20 (E): (113 + 20) (20 + 34); (R): 69 : num
Bases de Lenguajes de Programacin 17

1. Lenguaje Hope. Tipos


Un tipo de datos es una forma clasificar un valor de acuerdo a sus propiedades. Un tipo representa una clase de dominio de los datos Todo componente de un programa Hope tiene un tipo de datos. En particular, las operaciones y los operandos de las expresiones tienen tipos. Hope comprueba los tipos de una expresin antes de evaluarla.
Bases de Lenguajes de Programacin 18

1. Lenguaje Hope. Tipos


Se asegura que los tipos de las operaciones y los operandos son los esperados al evaluar una expresin funcional. En Hope existen tres tipos de datos bsicos num: Nmeros enteros (representados en expresiones como secuencia de dgitos). truval: Valores booleanos (solamente puede tomar el valor true o false). char: Caracteres imprimibles (tienen que estar encerrados entre comillas simples) En Hope+ se aade el tipo real (nmeros reales).
Bases de Lenguajes de Programacin 19

1. Lenguaje Hope. Funciones


Una funcin en Hope (regla de transformacin) establece una correspondencia entre dos dominios (colecciones de datos). Esta regla hace corresponder a todo elemento del (de los) dominio(s) origen un elemento del dominio destino. Ejemplo: El tipo de transformacin num truval indica que la funcin transforma un valor de tipo num (entero) en otro de tipo truval (booleano).
Bases de Lenguajes de Programacin 20

1. Lenguaje Hope. Funciones


En Hope todas las funciones tienen dos partes: su declaracin y su definicin. Ejemplo: Funcin que transforme una temperatura en grados Celsius a Fahrenheit. dec Fahrenheit : num -> num; (declaracin) --- Fahrenheit f <= (f - 32)*5 div 9; (definicin) Una vez definida, la funcin se incorpora a la mquina HOPE, usndose con distintos argumentos: (E): Fahrenheit 40; (R) 4: num
Bases de Lenguajes de Programacin 21

2. Tipos de datos. Expresiones sencillas


Los valores de tipo num son enteros que se representan por secuencias de dgitos. Existe un mximo para representar enteros que viene determinado por la mquina Hope. Los nmeros muy grandes (mayores de 9 cifras) se reescriben como mdulo de mximo valor permitido.

Bases de Lenguajes de Programacin

22

10

2. Tipos de datos. Expresiones sencillas


Operadores enteros:
+ * div mod Suma (Prioridad 5) Resta (Prioridad 5) Multiplicacin (Prioridad 6) Divisin (Prioridad 6) Mdulo (Prioridad 6)

Todos estos operadores son del tipo :


num # num num

No hay representacin directa para los nmeros negativos. Se recurre a expresiones como:
0 5; -5 : num
Bases de Lenguajes de Programacin 23

2. Tipos de datos. Expresiones sencillas


La operacin abs (abs : num -> num) devuelve el valor absoluto del nmero
(E): abs(0 5); (R) 5 : num

Al no disponer Hope de nmeros reales, el operador div ignora la parte fraccionaria del resultado de la operacin
(E): 3 div 2; (R) 1 : num

Hope+ s que incorpora el tipo real.


Bases de Lenguajes de Programacin 24

11

2. Tipos de datos. Expresiones sencillas


El tipo truval de Hope permite manejar valores y expresiones booleanas (resultado cierto o falso). Hope proporciona los siguientes operadores relacionales:
= /= < =< > >= Igual Distinto Menor que Menor o igual que Mayor que Mayor o igual que
Bases de Lenguajes de Programacin 25

2. Tipos de datos. Expresiones sencillas


Estas operaciones tienen prioridad 4 y pueden considerarse del tipo
num # num -> truval

Uso de los parntesis. Ejemplos:


(E): (3 + 5) /= (4 + 3); (R) true : truval (E): (2 + 3) < 5; (R) false : truval
Bases de Lenguajes de Programacin 26

12

2. Tipos de datos. Expresiones sencillas


Otras operaciones con booleanos:
and (lgico) Prioridad 5 truval # truval -> truval or (lgico) Prioridad 4 truval # truval -> truval not (lgico) Prioridad 3 truval -> truval

Ejemplo: (E): ((3 + 2) < 4) or ((3 - 2) > 0); (R) true : truval
Bases de Lenguajes de Programacin 27

2. Tipos de datos. Expresiones sencillas


En Hope, el tipo char representa a caracteres imprimibles, que deben escribirse entre comillas (E): A < B; (R) true : truval Operadores con caracteres: ord : char num ! ordinal de un carcter chr : num char ! carcter correspondiente ! a una posicin
Bases de Lenguajes de Programacin 28

13

2. Tipos de datos. Expresiones sencillas


Ejemplos:
Para convertir una letra l minscula a L mayscula se puede utilizar la siguiente expresin: chr(ord l +ord A ord a); El nmero que corresponde al dgito d es: ord d ord 0; El carcter representado por el nmero n (0 n9): chr(n + ord 0);
Bases de Lenguajes de Programacin 29

2. Tipos de datos. Expresiones sencillas


Ejemplo:
Programa Hope: dec cuadrado : num -> num; --- cuadrado (x) <= x * x; Evaluacin (paso a paso): cuadrado (3) 3 * 3 9 ! declaracin ! definicin

Bases de Lenguajes de Programacin

38

14

2. Tipos de datos. Expresiones sencillas


Ejemplo:
Programa Hope: dec cuadrado : num -> num; --- cuadrado (x) <= x * x; Evaluacin (paso a paso): cuadrado (3) 3 * 3 9 : num Evaluacin (global): cuadrado (3) 9 : num ! declaracin ! definicin

Bases de Lenguajes de Programacin

39

2. Tipos de datos. Expresiones sencillas


Ejemplo: (E): cuadrado (2 + 3 * 4);
cuadrado (2 + 12) cuadrado (14) 14 * 14 196 : num

Bases de Lenguajes de Programacin

40

15

2. Tipos de datos. Expresiones sencillas


Ejemplo: (E): cuadrado 2 + 3 * 4;
2 * 2 + 3 * 4; 4+3*4 4 + 12 16 : num

Bases de Lenguajes de Programacin

41

3.Tipos de datos. Expresiones condicionales


Hope, al igual que la mayora de los lenguajes de programacin, permite el uso de expresiones condicionales. La estructura bsica de esta expresiones es: if exp1 then exp2 else exp3 Las expresiones condicionales se puede anidar if exp1 then exp2 else if exp4 then exp5 else ...
Bases de Lenguajes de Programacin 42

16

3.Tipos de datos. Expresiones condicionales


Ejemplo: Mximo de dos nmeros naturales
m>n m, si max(m, n) = n, en otro caso

dec max: num # num num; --- max (m,n) <= if m > n then m else n;

Si se hace la llamada: max (7, 5); la evaluacin paso a paso es: if 7 > 5 then 7 else 5 if true then 7 else 5 7 : num
Bases de Lenguajes de Programacin 43

3.Tipos de datos. Expresiones condicionales


La definicin de funcin mximo se puede reutilizar para definir el mximo de tres valores (composicin funcional):
dec max3: num # num # num num; --- max3 (x,y,z) <= max(x, max(y,z));

Evaluacin: (E): max3(3, 5, 7); (R) 7 : num


Bases de Lenguajes de Programacin 44

17

3.Tipos de datos. Tuplas


Se define una n-tupla como una coleccin de n valores que se tratan como algo unitario. De forma intuitiva, ya se ha visto el concepto en la declaracin de funciones:
dec max: num # num -> num; max num#num num

En este caso se dira, la funcin max recibe una 2tupla de nmeros y devuelve un nmero.
Bases de Lenguajes de Programacin 45

3.Tipos de datos. Tuplas


No existe el concepto de tupla asociado a un nico elemento. Una funcin que reciba un nico argumento (no tupla) se pueden omitir los parntesis cuadrado (4); es lo mismo que: cuadrado 4; Un sinnimo de tupla puede ser lista de argumentos que se trata como un nico valor.

Bases de Lenguajes de Programacin

46

18

3.Tipos de datos. Tuplas


El uso de tuplas permite a una funcin el devolver una coleccin de valores (en realidad, se devuelve una tupla de valores). Ejemplo: Funcin que devuelva un par de enteros ordenados:
dec ord2: num # num -> num # num; --- ord2 (m,n) <= if m < n then (m,n) else (n,m);

Bases de Lenguajes de Programacin

47

3.Tipos de datos. Tuplas


Ejemplo: Funcin que devuelva el cociente y el resto de una divisin entera de dos valores.
dec DivEntera: num # num -> num # num; --- DivEntera (m,n) <= (m div n, m mod n);

Evaluacin: (E): DivEntera(7,3); (R) (2,1) : num # num (en general, no tiene por qu coincidir el tipo de los argumentos con el del resultado).
Bases de Lenguajes de Programacin 48

19

3.Tipos de datos. Tuplas


Si los tipos son adecuados, se pueden componer las funciones que se deseen. Por ejemplo: (E): max(DivEntera(11,4)); (R) 3 : num Otro ejemplo: (E): 3 + min(Fahrenheit(40), max (3,5)); (R) 7 : num

Bases de Lenguajes de Programacin

49

20