Download Bases de la Programación Funcional

Document related concepts
no text concepts found
Transcript
UNIDAD IV
Programación Funcional
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
?
é
u
q
r
o
P
2
Introducción
Porque aprender programación funcional?
- Recursión
- Abstracción funcional
- Funciones de primer orden
Estos conceptos se han incorporado en la mayoría de los
lenguajes de programación y deben formar parte del conjunto
de técnicas que todo programador profesional.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Introducción
Un lenguaje de programación funcional
tienen una gran flexibilidad, es conciso en su
notación y su semántica es sencilla.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Introducción
Posee varias ventajas respecto a la
programación imperativa, y se utiliza en
prototipado,
inteligencia
artificial,
sistemas de comprobación matemática
y programación lógica.
Los programas se definen como
funciones, y al tratar a las mismas como
datos limita los efectos colaterales y el
uso de administración de memoria.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
El inconveniente principal es la ineficiencia de la ejecución
de los lenguajes funcionales ya que debido a su naturaleza
dinámica el código es interpretado mas que compilado,
resultando esto una perdida sustancial de velocidad.
En los últimos años la aparición
de nuevas tecnologías ayudo a
atenuar esta situación.Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Pueden los lenguajes funcionales competir con los lenguajes
imperativos u OO?
- Nunca fueron lenguajes de “primer importancia”
- Programadores aprenden sobre lenguajes imperativos
- Los lenguajes OO se construyen sobre conceptos imperativos
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Introducción
Veremos:
- Concepto matemático de función
- Bases de la Programación Funcional
- Características
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Una función establece una asociación entre valores de
entrada y valores de salida.
Ejemplo:
Función doble: 2 → 4
5 → 10
Función capital: Argentina → Bs. As
España → Madrid
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Una Función es una regla de correspondencia en la que a
un elemento del conjunto Dominio le corresponde un único
elemento del conjunto Imagen.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Función doble
Dominio: Enteros
Imagen: Enteros
Función capital
Dominio: Paises
Imagen: Ciudades
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Aplicación de una función: es la particularización de la
regla de correspondencia en la que a un valor del Dominio le
corresponde un valor concreto de la Imagen.
Esto se representa con la notación: f(x)=y
f: nombre de la función
x: argumento
y: resultado
doble(5) = 10
capital(Argentina) = Bs.As.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Existen funciones conocidas y con notación universal que
comunmente son representadas por un operador.
Ejemplo: Suma, Resta, etc. (Notación empírica)
Composición de funciones: el argumento de una
función puede provenir del resultado de otra función o de la
misma.
Ejemplo:
doble(doble(5)) = 20
doble(mayor(3,5))= 10
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Concepto matemático de función
Definición de Funciones:
Comprensión: ecuación cuya parte izquierda la componen los
argumentos (entrada) y la parte derecha la representa la expresión
algebraica de las operaciones que componen la función.
Ejemplo: funcion doble x = 2 * x
Extensión: conjunto de pares ordenados donde el primer elemento
es un valor del conjunto dominio y el segundo del conjunto imagen
Ejemplo: función capital
Argentina = Bs.As.
España = Madrid
...
Italia
Roma
Lic. Jesús Germán Andrés
PAUTSCH - =
FCEQyN
- UNaM
Introducción
- Concepto matemático de función
- Bases de la Programación Funcional
- Características
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
También llamada Declarativa con el paradigma lógico de
programación.
Busca describir los problemas como funciones matemáticas
puras sin efectos “laterales”.
Detalla lo que hay que calcular y no detallan como.(contrario a
los programas imperativos)
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
Como ya mencionamos se asimila al uso de una hoja de
cálculo o una calculadora. El usuario ingresa una expresión y el
sistema la evalúa mediante un proceso de reducción.
Se caracteriza por poseer Transparencia Referencial: el
resultado devuelto por una función sólo depende de los
argumentos que se le pasan a la llamada.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
PROGRAM ConEfectoLateral;
VAR estado: boolean;
FUNCTION Efectos (n: integer): integer;
BEGIN
IF (estado) THEN
Efectos:= n
ELSE
Efectos:= 2*n+1;
estado:= NOT estado;
END;
BEGIN
estado = TRUE;
WriteLn(Efectos(1), ' ', Efectos(1));
WriteLn(Efectos(2), ' ', Efectos(2));
END;
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
PROGRAM ConEfectoLateral;
VAR estado: boolean;
FUNCTION Efectos (n: integer): integer;
BEGIN
IF (estado) THEN
Efectos:= n
ELSE
Efectos:= 2*n+1;
estado:= NOT estado;
END;
BEGIN
estado = TRUE;
WriteLn(Efectos(1), ' ', Efectos(1));
WriteLn(Efectos(2), ' ', Efectos(2));
END;
Llamada a la funcion con los mismos
argumentos
produce resultados distintos.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
x=x+1
x = <expresion>
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
En los programas funcionales tampoco hay que manejar
punteros de memoria, y por lo tanto, no existe la necesidad
de instrucciones de asignación:
- el programador no gestiona la memoria
- no existe concepto de puntero de memoria
- x = <expresión>
Esto último no es una asignación. x es, por definición,
igual a <expresión>. x siempre podrá sustituirse por su
definición en cualquier lugar, ya que no habrá efectos
laterales.
- Resulta obvio que en un mismo programa no puede
aparecer otra definición de x
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Bases de la Programación Funcional
Estructuras de control en los programas funcionales:
1) composición funcional
2) construccion condicional
3) recursividad
A travez de esta ultima se modelan los bucles, ya que no
hay manera de incrementar o decrementar el valor de una
variable.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Introducción
Veremos:
- Concepto matemático de función
- Bases de la Programación Funcional
- Características
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
- Funciones de orden superior
- Tipado fuerte y estático
- Inferencia de tipos
- Polimorfismo
- Orden de evaluación normal y perezosa
- Tipos de datos definidos por el usuario
- Ajuste de patrones
- Listas por comprensión
Estas ultimas 3 las veremos mas adelante con hashkell
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Funciones de orden superior:
Aquí las funciones son tratadas como valores de primera
clase. Por lo que pueden ser almacenadas en estructuras de
datos, pasadas como parámetros y devueltas como
resultado. Esto proporsiona un alto nivel de abtracción.
Ejemplo: doble(mayor(7,3))=14
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Tipado estático:
Los errores se detectan en tiempo de compilación
Fuertemente tipado: Ejemplo Hashkell "/" no tolera divisores
de tipo integer
No hay obligación de declarar el tipo de datos de las
expresiones, el compilador infiere el tipo.
Si se declara el tipo el compilador lo verifica
Ejemplo:
saludo(x) = IF x THEN "adios" ELSE "hola"
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Polimorfismo:
Aumenta la reusabilidad. El tipo de una función depende
de un parámetro.
Ejemplo funcion longuitud.
No hay necesidad de conocer los tipos de la lista sino solo
“recorrer” y devolver la cantidad de elementos.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Orden de evaluación:
Aplicativo: se reducen las expresiones mas internas antes
que las externas (de izquierda a derecha). Programación
tradicional(imperativa).
Normal: se reducen las expresiones mas externas antes que
las internas (de izquierda a derecha). Programación
funcional.
Perezosa: las expresiones solo se evaluan en el momentos
que se las necesita.
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Que sucede en este código?
Ejemplo:
g(x:integer): integer
begin
/////"bucle sin fin"
while true do x:=x;
end;
****Programa Principal****
BEGIN
Write (f(4,g(5));
END
f(x,y:integer): integer
begin
f:=x+3;
end;
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM
Características
Ejemplo:
g(x:integer): integer
begin
/////"bucle sin fin"
while true do x:=x;
end;
****Programa Principal****
BEGIN
Write (f(4,g(5));
END
f(x,y:integer): integer
begin
f:=x+3;
end;
Evaluación tradicional provoca un bucle sin fin.
Con evaluación perezosa el resultado es 7 dato que la
funcion solo se sustituye por su definición
Lic. Jesús Germán Andrés PAUTSCH - FCEQyN
- UNaM