Ed Tema 1 El Estilo Funcional
-
Upload
jesusalbertodominguezalvarez -
Category
Documents
-
view
222 -
download
0
Transcript of Ed Tema 1 El Estilo Funcional
-
7/23/2019 Ed Tema 1 El Estilo Funcional
1/62
Estructuras de Datos.
Grados en Ingeniera Informtica, del Software y de Computadores
ETSI Informtica
Universidad de Mlaga
Jos E. Gallardo, Francisco Gutirrez, Pablo Lpez
Dpto. Lenguajes y Ciencias de la Computacin
Universidad de Mlaga
-
7/23/2019 Ed Tema 1 El Estilo Funcional
2/62
Programacin Funcional
Programacin Imperativa vs Programacin Funcional Funciones puras e impuras
Ventajas de la Programacin Funcional
Introduccin a Haskell Identificadores
Tipos bsicos
Definiciones de funciones. Aplicaciones Operadores, precedencia y asociatividad
Evaluacin de expresiones
Tuplas
Polimorfismo y sobrecarga
Ecuaciones condicionales y expresiones
Funciones definidas parcialmente Definiciones locales
Operadores vs Funciones
Introduccin a QuickCheck
2
-
7/23/2019 Ed Tema 1 El Estilo Funcional
3/62
Los cmputos manipulan variables mutables
Estas variables mutables representan la memoria o el
estado del computador
Los algoritmos modifican las variables hasta obtener el
resultado deseado
3
Las variables i y p son
alteradas durante la
ejecucin
http://en.wikipedia.org/wiki/Imperative_programming
-
7/23/2019 Ed Tema 1 El Estilo Funcional
4/62
Un estilo de programacin basado en cmputos a travsde funciones matemticas (o puras) :http://en.wikipedia.org/wiki/Functional_programming
Un programa es una funcin
Toma datos a travs de sus argumentos
Realiza clculos con estos datos a travs de expresiones
Devuelve nuevos datos (resultados del cmputo)
Nada cambia !
No existe el concepto de variable mutable tpico de la programacin
imperativa4
funcin
(programa)
datos
argumentos
nuevos datos
resultado
-
7/23/2019 Ed Tema 1 El Estilo Funcional
5/62
Funcin para calcular factorial en Haskell:
Evaluacin paso a paso:
5
No hay variables
mutables. Tan solofunciones y expresiones
-
7/23/2019 Ed Tema 1 El Estilo Funcional
6/62
Una funcin matemtica siempre devuelve el mismoresultado para los mismos valores de susargumentos:
x= y f (x) = f (y) (Regla de Leibniz)
Esto conduce a la propiedad de transparenciareferencial:
Una misma expresin denota siempre el mismo valor, seacual sea el punto del programa o el contexto en queaparezca.
Simplifica el razonamiento sobre las propiedades de
los programas (en particular, la correccin) Podemos calcular con programas al igual que en
matemticas calculamos con expresiones
6
http://en.wikipedia.org/wiki/Pure_function
-
7/23/2019 Ed Tema 1 El Estilo Funcional
7/62
Un ejemplo de funcin pura:
siempre devuelve
Si = entonces =
7
-
7/23/2019 Ed Tema 1 El Estilo Funcional
8/62
La siguiente no es una funcin pura:
La primera llamada devuelve
La segunda llamada devuelve Para el mismo valor del argumento
devuelve diferentes resultados8
-
7/23/2019 Ed Tema 1 El Estilo Funcional
9/62
La siguiente tampoco es una funcin pura (no esmatemtica):
Cada llamada puede devolver un valor distinto
9
-
7/23/2019 Ed Tema 1 El Estilo Funcional
10/62
La programacin funcional consiste en escribirprogramas (funciones) combinando otrasfunciones
En los lenguajes funcionales puros:
Solamente podemos definir funciones puras
Se satisface la transparencia referencial
Miranda, Clean, Haskell,
En los lenguajes funcionales impuros: Se permite definir funciones impuras
ML, F#, Scheme, 10
-
7/23/2019 Ed Tema 1 El Estilo Funcional
11/62
Optimizacin: el compilador puede realizar
transformaciones sofisticadas con objeto de optimizar elcomportamiento
Paralelismo: partes de una expresin pueden evaluarse encualquier orden sin alterar el resultado; incluso varios
procesadores pueden intervenir en la evaluacin de lamisma expresin. La Programacin Funcional Pura es intrnsecamente paralela
La Programacin Imperativa es intrnsecamente secuencial
Memoization: los resultados producidos por las llamadas a
una funcin pueden ser reutilizados (recordados) ensucesivas llamadas con los mismos valores de losargumentos
11
-
7/23/2019 Ed Tema 1 El Estilo Funcional
12/62
En un LFP (lenguaje funcional puro), la definicin:
puede reemplazarse por :
sin modificar el significado del programa.
Esta sencilla transformacin es una optimizacin:solamente se computa (evala) una vez
Adems, la expresinpuede evaluarse va paralelismo
Lo anterior no es vlido en lenguajes impuros
12
-
7/23/2019 Ed Tema 1 El Estilo Funcional
13/62
Un Lenguaje Funcional Puro estndar
Principales caractersticas:
Pureza funcional
Tipificacin esttica
Perezoso (Lazy)
13
www.haskell.org
-
7/23/2019 Ed Tema 1 El Estilo Funcional
14/62
Haskell distingue maysculas de minsculas (case sensitive) !
Los identificadores (nombres) de funciones y argumentos: Deben empezar con una letra minscula o el carcter _ (underscore) y ste
puede ir seguido de letras (maysculas o minsculas), dgitos, tildes (') o _
Ejemplos vlidos de identificadores:
Ejemplos no vlidos:
Los nombres de tipos deben empezar con una letra mayscula
, , , , , etc. Los nombres de operadores:
Pueden contener uno o varios smbolos
El primero no puede ser dos-puntos (:) Ejemplos vlidos:
14
-
7/23/2019 Ed Tema 1 El Estilo Funcional
15/62
un subconjunto acotado de los nmeros enteros operaciones rpidas; posibilidad de overflowo
underflow
15
-
7/23/2019 Ed Tema 1 El Estilo Funcional
16/62
el conjunto completo de los enteros
subconjunto de los reales en simple precisin
subconjunto de los reales en doble precisin
16
-
7/23/2019 Ed Tema 1 El Estilo Funcional
17/62
tiene solamente dos valores: y
conjuncin lgica (and):
disyuncin lgica (or):
negacin lgica:
x y not primo yHay evaluacin en cortocircuito
17
http://en.wikipedia.org/wiki/George_Boole
-
7/23/2019 Ed Tema 1 El Estilo Funcional
18/62
conjunto de caracteres Unicode :, , , , , , , ,
, , , , , ,
Muchas funciones sobre caracteres aparecendefinidas en el mdulo o librera :
18
-
7/23/2019 Ed Tema 1 El Estilo Funcional
19/62
Haskell usa notacin parcializada (curried)
Introducida porMoses Schnfinkel (1889-1942)
y popularizada por
Haskell Curry (1900-1982)
Para definir una aplicacin:
Escribimos el identificador de la funcin y acontinuacin los argumentos separados por espacios
El uso de parntesis slo ser necesario para agrupartrminos compuestos y modificar el efecto de lasprioridades de las operaciones
19
http://en.wikipedia.org/wiki/Currying
-
7/23/2019 Ed Tema 1 El Estilo Funcional
20/62
20
nombre de
la funcin argumentoresultado
toma un
entero
devuelve un
entero
toma dos enteros
y devuelve un
entero
-
7/23/2019 Ed Tema 1 El Estilo Funcional
21/62
21
square solo se aplica
una vez al 5
square se aplica a la suma5 + 1.
Los parntesis son
necesarios
phytagoras se aplica
a los dos argumentos
El segundo argumento escompuesto y necesita
parntesis
-
7/23/2019 Ed Tema 1 El Estilo Funcional
22/62
22
Una expresin condicional, como cualquier otraexpresin, puede formar parte del cuerpo de una
funcin:
-
7/23/2019 Ed Tema 1 El Estilo Funcional
23/62
23
El cuerpo de una funcin puede contener a la funcin que define
El uso del tipo (subconjunto finito) causar problemas:
El problema se resuelve tomando Integer (una abstraccin del
conjunto completo de los enteros)
-
7/23/2019 Ed Tema 1 El Estilo Funcional
24/62
GHC es el Glasgow Haskell Compiler, un compiladorde alta calidad para Haskell
GHCi es el Glasgow Haskell Compiler Interpreter:
Con el uso del bucle Read-Eval-Printpodemos ejecutar
programas Haskell
GHC y GHCi estn disponibles para las plataformas
ms populares: Windows, Linux y OSX
En la pgina web de la asignatura aparecen
instrucciones de instalacin24
-
7/23/2019 Ed Tema 1 El Estilo Funcional
25/62
Dos entornos para GHCi
25
-
7/23/2019 Ed Tema 1 El Estilo Funcional
26/62
El operador unario es el nico operador unariosimblico prefijo:
El resto de operadores simblicos son binarios y seusan directamente en forma infija:
Precedence parsing error
26
-
7/23/2019 Ed Tema 1 El Estilo Funcional
27/62
Nivel Operador predefinido
Mxima precedencia 10 Aplicacin de una funcin
9
8
7
6
5
4
3
2
1
Mnima precedencia 0
27
La aplicacin de una
funcin tiene prioridad
mxima
La multiplicacin tiene
mayor nivel de
precedencia que la suma
-
7/23/2019 Ed Tema 1 El Estilo Funcional
28/62
Esta propiedad permite resolver la ambigedaden ausencia de parntesis:
Si asocia a la izquierda:
Si asocia a la derecha:
Si no es asociativo:
28
ERROR: los parntesis
son necesarios
-
7/23/2019 Ed Tema 1 El Estilo Funcional
29/62
Ejemplos:
Asociatividad OperadorDerecha
Izquierda
No asociativo
29
Expresin errnea
Use parntesis si
desconoce la
asociatividad
-
7/23/2019 Ed Tema 1 El Estilo Funcional
30/62
Son diferentes conceptos que no deben ser
confundidos
La asociatividad es un atributo sintctico de unoperador en un lenguaje de programacin
El operador verifica la propiedad asociativa ensentido matemtico si satisface:
x, y, z . (x y) z = x (y z)
La propiedad asociativa tambin es interesante
computacionalmente: Para evaluar x y z se parentizar de acuerdo con el
menor coste computacional.
30
-
7/23/2019 Ed Tema 1 El Estilo Funcional
31/62
Nivel de precedencia
infix = no asociativo.infixl = asociativo a izda
infixr = asociativo a dcha
El identificador del
operador debe
aparecer entre
parntesis en unadeclaracin de tipo
31
-
7/23/2019 Ed Tema 1 El Estilo Funcional
32/62
Toda funcin de dos argumentos cuyo identificador sea literal
puede ser utilizada en forma infija encerrndolo entre acentos
graves (`)notacin prefija
Error
32
Si la funcin es asociativa
no son necesarios los
parntesis
forma infija
-
7/23/2019 Ed Tema 1 El Estilo Funcional
33/62
Recprocamente, cualquier operador simblico puede utilizarse en
forma prefija encerrndolo entre parntesis
33
forma prefija
forma infija
Error
-
7/23/2019 Ed Tema 1 El Estilo Funcional
34/62
34
-
7/23/2019 Ed Tema 1 El Estilo Funcional
35/62
Redex (reducible expression): parte de una expresin que puede
ser simplificada
Reduccin: proceso de reescritura de un redex. Cada reduccin es
un paso de cmputo
Forma Normal : expresin sin redexes
35
redex
reduccin
es una formanormal
-
7/23/2019 Ed Tema 1 El Estilo Funcional
36/62
36
Orden Aplicativo
Se reduce el redex ms interno y ms
a la izquierda.
Los argumentos son evaluados antes
que la funcin
Pros
Los argumentos compuestos seevalan una sola vez
Contras
Pueden realizarse reducciones
innecesarias.
Puede no conducir a la forma normal
(no es normalizante)
-
7/23/2019 Ed Tema 1 El Estilo Funcional
37/62
37
Orden Aplicativo
Se reduce el redex ms interno y ms
a la izquierda.
Los argumentos son evaluados antes
que la funcin
Pros
Los argumentos compuestos seevaluan una sola vez
Contras
Pueden realizarse reducciones
innecesarias.
Puede no conducir a la forma normal
(no es normalizante)
-
7/23/2019 Ed Tema 1 El Estilo Funcional
38/62
38
Orden Normal
Se reduce el redex ms externo y
ms a la izquierda.
La funcin es aplicada antes de
evaluar sus argumentos
Pros
Slo se evalan las expresiones
necesarias.
Siempre conduce a la forma normal si
sta existe (normalizante)
Contras
Puede repetirse la evaluacin de un
argumento compuesto
-
7/23/2019 Ed Tema 1 El Estilo Funcional
39/62
39
Orden Normal
Se reduce el redex ms externo y
ms a la izquierda.
La funcin es aplicada antes de
evaluar sus argumentos
Pros
Slo se evalan las expresiones
necesarias.
Siempre conduce a la forma normal si
sta existe (normalizante)
Contras
Puede repetirse la evaluacin de un
argumento compuesto
-
7/23/2019 Ed Tema 1 El Estilo Funcional
40/62
Haskell usa evaluacin perezosa (lazy) :
Combina las ventajas del orden normal y del aplicativo
Es similar al orden normal pero evita la reevaluacin:
Los argumentos son evaluados una sola vez y su valor comn
es compartido (sharing)
Esta optimizacin es posible en lenguajes puros
40
valorcompartidovalorcompartido
-
7/23/2019 Ed Tema 1 El Estilo Funcional
41/62
Son estructuras de datos heterogneas:
Es una coleccin de valores (componentes)
Cada componente puede tener un tipo distinto
Sintaxis: Los valores se separan por comas y se colocan entre
parntesis
Los tipos de cada componente se separan por comas y
se colocan entre parntesis
41
-
7/23/2019 Ed Tema 1 El Estilo Funcional
42/62
42
-
7/23/2019 Ed Tema 1 El Estilo Funcional
43/62
Funciones predefinidas que extraen las componentes de una tupla:
Patrn de una2-tupla
y son variables de tipo; toma
una 2-tupla con componentes de tipos
arbitrarios y . Se dice que es
polimrfica.
Prelude
Prelude
Indica una
funcin
predefinida
Debe leerse como: , .
43
-
7/23/2019 Ed Tema 1 El Estilo Funcional
44/62
Unaclase de tipos es un conjunto de tipos que comparten alguna operacin
es la clase predefinida para los tipos numricos (enteros, flotantes,
racionales, ...)
Algunos operadores y funciones solamente tienen significado para tipos
numricos:
Prelude
tipo sobrecargado
debe ser una
instancia de ; es
decir, debe ser un
tipo numrico
Los operandos y el resultado
tienen que ser del mismo tipo
debe leerse como:
.
44
http://en.wikipedia.org/wiki/Type_class
-
7/23/2019 Ed Tema 1 El Estilo Funcional
45/62
suma sobreInteger
producto sobre
Floating
2 est sobrecargado
Char no es de la clase Num
Type error
45
-
7/23/2019 Ed Tema 1 El Estilo Funcional
46/62
es la clase que agrupa los tipos de nmeros enteros
Tiene funciones especficas para la divisin entera:
Prelude
Tipo sobrecargadoipo sobrecargado
debe ser de la clase
Integral
debe leerse como:
.
cociente y resto de la
divisin entera
Los nmeros Floating no
son Integral.
Type error
46
-
7/23/2019 Ed Tema 1 El Estilo Funcional
47/62
es la clase que agrupa los tipos de nmeros fraccionarios:
flotantes y racionales (cocientes de enteros , ...) La funcin esencial es la divisin fraccionaria:
Prelude
El tipo debe ser
de la clase
Fractional
Esto debe leerse como: .
Divisin
fraccionaria
10 y 3 estnsobrecargados
47
-
7/23/2019 Ed Tema 1 El Estilo Funcional
48/62
Esta funcin usa el operador
sobrecargado
Solo puede ser aplicada a tipos
numricos; la funcin hereda el
contexto
48
-
7/23/2019 Ed Tema 1 El Estilo Funcional
49/62
es la clase de los tipos para los cuales existe una relacin de orden total;
entre stos aparecen Integer, Double, Char, Rational, Bool, Ciertos operadores (
-
7/23/2019 Ed Tema 1 El Estilo Funcional
50/62
es la clase de los tipos para los cuales existe una relacin de igualdad; entre
stos aparecen Integer, Double, Char, Rational, Bool, La clase incluye dos operadores:
Prelude
debe ser un tipo
instancia deSolo podemos comparar
valores del mismo tipo, y
el resultado siempre ser
un booleano
Debe leerse como: .
50
-
7/23/2019 Ed Tema 1 El Estilo Funcional
51/62
51
1 es menor que 2
1 no es igual a 2
1 es distinto de 2
1 esLess Than2
10 es reater Than2
1 es Qual a 1
El mayor de 3.5 y 7.8 es 7.8
El menor de 3.5 y 2.0 es 2.0
-
7/23/2019 Ed Tema 1 El Estilo Funcional
52/62
52
-
7/23/2019 Ed Tema 1 El Estilo Funcional
53/62
A menudo es ms sencillo describir una
funcinpor partes:
Su valor es 1, si el
argumento es positivo
Guardas booleanas
Su valor es -1, si el
argumento es negativo
Su valor es 0, si el
argumento es nulo
53
http://en.wikipedia.org/wiki/Guard_(computing)
Atencin al
sangrado . Los
separadores
en la misma
columna
-
7/23/2019 Ed Tema 1 El Estilo Funcional
54/62
La definicin anterior:
puede escribirse de forma ms corta (estilo preferente):
otherwise therwise: esta condicin
siempre es cierta. Ser
seleccionada si fallan las
previas
54
Prelude
-
7/23/2019 Ed Tema 1 El Estilo Funcional
55/62
Las expresiones condicionales proporcionan una
alternativa a las formas guardadas:
Prelude
55
-
7/23/2019 Ed Tema 1 El Estilo Funcional
56/62
Hay funciones definidas solo parcialmente:
Esto se consigue va la funcin error:
Error es una funcin polimrfica:
error :: -> a
56
el valor de tipo String
describe la
excepcin
Prelude
-
7/23/2019 Ed Tema 1 El Estilo Funcional
57/62
La palabra reservada permite definir funciones o variables
locales, y debe aparecer al final de la definicin
where: debe
sangrarse con
respecto a la funcin
Las definiciones locales deben
sangrarse al mismo nivel
57
-
7/23/2019 Ed Tema 1 El Estilo Funcional
58/62
Una alternativa para introducir definiciones locales es va la
construccin
resultado de la
expresin
definiciones localesLas definiciones locales
deben estar sangrarseal mismo nivel
58
-
7/23/2019 Ed Tema 1 El Estilo Funcional
59/62
Es una buena prctica probar los
programas
Las pruebas ayudan a encontrar
errores
QuickCheck es una librera de Haskell que ayuda a
probar los programas
Definimos propiedades que nuestros programas deben
cumplir QuickCheck genera casos de prueba y verifica las
propiedades para esos casos59
-
7/23/2019 Ed Tema 1 El Estilo Funcional
60/62
Propiedades en QuickCheck:
antecedente consecuente
antecedente y consecuente deben ser expresionesbooleanas
Debe leerse como una implicacin lgica: si el antecedentees cierto entonces el consecuente tambin debe serlo
QuickCheck solo realiza las verificaciones para propiedadesen las que el antecedente es cierto. Las pruebas conantecedente falso son descartadas
Se debe usar si la propiedad es el propio consecuente
consecuente60
-
7/23/2019 Ed Tema 1 El Estilo Funcional
61/62
Algunas propiedades:
61
Fallo en la prueba
contraejemplo
Hacemos que
QuickCheck pruebenuestra propiedad
con enteros
aleatorios
2. . 2
. . | | || ||
0. 0 . | | || ||
-
7/23/2019 Ed Tema 1 El Estilo Funcional
62/62
Edsger W. Dijkstra (1930-2002, Premio Turing 1972)
Para establecer la correccin de un algoritmo se debe realizar una
demostracin
Algunas veces es difcil y lleva mucho tiempo
Realizar pruebas es mejor que no hacer nada
62
Las pruebas de un programa
pueden usarse para mostrar la
existencia de errores, pero nunca
para demostrar su ausencia!
http://en.wikipedia.org/wiki/Edsger_W._Dijkstra