Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Indice General
1 Evoluci
on y Conceptos b
asicos 3
2 Definici
on de funciones 3
3 Sistema de Tipos 7
3.1 Tipos Predefinidos primitivos . . . . . . . . . . . . . . . . . . . . 8
3.2 Tpos definidos por enumeracion . . . . . . . . . . . . . . . . . . . 8
3.3 Tipos mediante Producto cartesiano . . . . . . . . . . . . . . . . 9
3.4 Combinacion de productos y enumeraciones . . . . . . . . . . . . 10
3.5 Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.6 Tipos parametrizados . . . . . . . . . . . . . . . . . . . . . . . . 13
3.7 Tipos recursivos . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.8 Tipos recursivos parametrizados . . . . . . . . . . . . . . . . . . 15
5 Modelos de Evaluaci on 25
5.1 Evaluaci
on impaciente vs. perezosa . . . . . . . . . . . . . . . . . 25
5.2 Programacion con estructuras infinitas . . . . . . . . . . . . . . . 27
6 Entrada/Salida 28
7 Clases de tipos 28
8 T
ecnicas de demostraci
on 28
1
INDICE GENERAL 2
1 Evoluci
on y Conceptos b
asicos
kFalta por
hacer: Falta
Bases te
oricas: c
alculo lambda de Church
por desarrollar
LISP, Funciones de orden superior esta seccion
con mas
ISWIM, notaci
on infija detallek
FP, combinadores
ML, polimorfismo parametrico, chequeo estatico de tipos, inferencia de
tipos
Hope, encaje de patrones
Miranda, Evaluaci
on perezosa
Haskell, sobrecarga (clases de tipos), Entrada/Salida (monadas)
2 Definici
on de funciones
Los lenguajes funcionales utilizan un modelo computacional simple similar al de
una calculadora.
Ejemplo 1 (suma2)
?-ft (3,4)
10
Mediante curryficacion.
Definici
on 2 (currificacion) La currificaci
on (currying) consiste
en simular funciones de varios argumentos mediante funciones de
orden superior de un argumento
?-fc 3 4
10
En realidad, la precedencia de las declaraciones de tipos en Haskell
hace innecesarios los parentesis de la declaracion anterior y La nota-
ci
on lambda puede simplificarse mediante encaje de patrones. Dicha
definici
on podra reescribirse como:
Ejemplo 4 (fc)
Ejemplo 5 (comp)
Ejemplo 6 (fcm)
?-fcm 2
11
La funci
on composici
on esta predefinida como el operador (.).
> fact 0 = 1
> fact n = n * fact (n - 1)
?-fact 5
120
2 DE FUNCIONES
DEFINICION 6
> cuboS x = (x + 1) * (x + 1) * (x + 1)
3 Sistema de Tipos
El universo de posibles valores que puede tomar una expresion se divide en tipos
Definicion 3 (Tipo) Un tipo es un conjunto de valores que puede tomar una
expresi
on.
En Haskell, un valor pertenece a un unico tipo, que es reconocido y compro-
bado por el sistema sin necesidad de ejecutar el programa. Se realiza, por tanto,
una comprobaci on de tipos en tiempo de compilacion. Las principales ventajas
son:
Seguridad, se impide la ejecucion de programas que podran producir erro-
res de tipo.
Eficiencia, no es necesario realizar comprobaciones de tipo en tiempo de
ejecuci
on.
Ejemplo 13 (eligeSaludo)
La declaraci
on de tipos puede verse como una especificacion de lo que el pro-
gramador pretende realizar. Dicha especificacion puede comprobarse de forma
automatica sin necesidad de ejecutar el programa.
Es posible considerar que los tipos predefinidos primitivos han sido definidos
originalmente por enumeracion.
3 SISTEMA DE TIPOS 9
3.4 Combinaci
on de productos y enumeraciones
Es posible definir tipos de datos mediante la combinacion de productos carte-
sianos y enumeraciones (tambien denominadas sumas o variantes)
Ejemplo 19 (Forma) El tipo de datos Forma define figuras geometricas que
pueden estar formadas por crculos con un determinado radio o rect
angulos con
una base y altura determinadas
?-
area f2
20.0
En la definici
on de un tipo de datos, los constructores de tipo sirven como
etiquetas que permiten identificar que tipo de datos se esta utilizando.
Ejemplo 21 (Complejos con representaci on polar) En el siguiente ejem-
plo se define un tipo de datos complejo que admite dos tipos de representaciones:
en forma cartesiana y en forma polar. Los constructores de tipo Carte y Polar
permiten identificar el tipo de representaci
on que se est
a utilizando.
3.5 Registros
En la definicion de tipos mediante productos, es posible asignar un nombre a
los diferentes campos.
> data Persona = Per { dni :: Integer, nombre :: String, edad :: Int }
>
> pepe = Per { dni = 9987623, nombre = "Jose Ibarra", edad = 28 }
Ejemplo 26 (Par) El tipo de datos Par define un tipo de datos formado por
pares de elementos del mismo tipo.
?-sumaNat n2 n2
Sig (Sig (Sig (Sig Cero)))
?-prodNat n2 n3
Sig (Sig (Sig (Sig (Sig (Sig Cero)))))
?-sumaLInt ls3
13
?-long [4,5,6]
3
4
TECNICAS RECURSIVA
DE PROGRAMACION 16
?-long "hola"
4
4 T
ecnicas de programaci
on Recursiva
En esta secci
on se indicar
an varios patrones de tratamiento de estructuras re-
cursivas. Estos patrones se aplicaran principalmente a listas, pero muchos de
ellos pueden generalizarse a otras estructuras como arboles, rosales, etc.
La funci
on aplica est
a predefinida como la funcion map
4
TECNICAS RECURSIVA
DE PROGRAMACION 17
Ejemplo 38 (prodLs)
Ejemplo 39 (longLs)
Ejemplo 42 (prodLs)
Ejemplo 43 (longLs)
La funci
on andLs est
a predefinida como la funcion and
Ejemplo 45 (orLs)
La funci
on orLs est
a predefinida como la funcion or
4
TECNICAS RECURSIVA
DE PROGRAMACION 19
Ejemplo 46 (append)
La funci
on append est
a predefinida como el operador (++)
Ejemplo 47 (vuelta)
La funci
on vuelta est
a predefinida como la funcion reverse
Ejemplo 48 (tomaMientras)
La funci
on tomaMientras esta predefinida como la funcion takeWhile
Ejemplo 49 (filtra)
La funci
on filtra est
a predefinida como la funcion filter
La funci
on comb est
a predefinida como la funcion zip
?-cpares20
[4,16,36,64,100,144,196,256,324,400]
?-divisores 24
[1,2,3,4,6,8,12,24]
Ejemplo 53 (foldLeft)
La funci
on foldLeft est
a predefinida en Haskell como foldl
Cuando la operaci
on op es asociativa y e es el elemento neutro de op, se
cunple que:
foldr op e = foldl op e
En general, foldr es mas eficiente que foldl. Sin embargo, foldl puede
ser u
til en cierto tipo de definiciones
Ejemplo 54 (ls2n) La funci
on ls2n convierte una lista de dgitos en un n
umero
decimal
?-ls2n [1,3,4]
134
?-maxLs [-1,-3,-4]
-1
?-ruffini 3 [2,4,3]
[2,10,33]
> unfold :: (a -> Bool) -> (a -> b) -> (a -> a) -> a -> [b]
> unfold p f g x = if p x then []
> else f x : unfold p f g (g x)
?-d2b 13
[1,1,0,1]
La funci
on sumaArbol calcula la suma de los nodos de un
arbol
?-sumaArbol a1
14
La funci
on nodosArbol devuelve la lista de nodos de un
arbol
?-nodosArbol a1
[3,4,5,2]
La funci
on sumaRosal calcula la suma de los nodos de un rosal
La funci
on nodosRosal devuelve la lista de nodos de un rosal
Sera deseable definir una funcion fold generica que recorriese y transformase
todo tipo de estructuras recursivas. Aunque Haskell no permite este tipo de
definiciones, existe una extension del lenguaje denominada Generic Haskell que
permite definir funciones genericas, tambien denominadas politpicas.
5 Modelos de Evaluaci
on
5.1 Evaluaci
on impaciente vs. perezosa
En el modelo de evaluaci on de los lenguajes funcionales, el usuario introduce
una expresion que es evaluada por el sistema. La evaluacion consiste en bus-
car subexpresiones dentro de la expresion que puedan transformarse utilizando
las funciones predefinidas y las funciones definidas por el usuario. Cuando no
es posible realizar m
as transformaciones se dice que se ha alcanzado la forma
normal.
Existen dos estrategias fundamentales de evaluacion: evaluacion aplicativa
y evaluaci
on normal.
5
MODELOS DE EVALUACION 26
En la evaluaci
on aplicativa, se eligen las subexpresiones mas internas de la
expresi
on, mientras que en la evaluacion normal, se eligen las subexpresiones
mas externas.
Supongase que se definen las funciones
> cuad x = x * x
> prim (x,y) = x
Con evaluaci
on normal, se eval
uan primero las llamadas a la funcion, ob-
teniendo:
Como puede observarse, el primer esquema tarda mas ya que puede haber
argumentos que no se utilizan en el resultado y, sin embargo, son evaluados.
Este tipo de modelo tambien se conoce como evaluaci on impaciente (del ingles
eager ) o estricta. En casos extremos, si alguno de dichos argumentos produce un
error (por ejemplo, una division por cero), o no finaliza, el sistema no devolvera
el resultado adecuado.
Por ejemplo, al evaluar prim (cuad 3, 1/0)
Con evaluaci
on aplicativa
5
MODELOS DE EVALUACION 27
prim (cuad 3, 1 / 0)
= prim (3 * 3, 1 / 0)
= prim (9, 1 / 0)
= Error, divisi
on por cero...
Con evaluaci
on normal, se obtiene
prim (cuad 3, 1 / 0)
= cuad 3
= 3 * 3
= 9
cuad (5 + 2)
= (5+2) * (5 + 2)
= 7 * (5 + 2)
= 7 * 7
= 49
cuad (5 + 2)
= x * x donde x = 5 + 2
= x * x donde x = 7
= 49
5.2 Programaci
on con estructuras infinitas
kFalta por
hacer: k
6 ENTRADA/SALIDA 28
6 Entrada/Salida
kFalta por
hacer: k
7 Clases de tipos
kFalta por
hacer: k
8 T
ecnicas de demostraci
on
kFalta por
hacer: k
9 Programaci
on a gran escala
9.1 Sistema de M
odulos
kFalta por
hacer: k
9.2 Tipos abstractos de datos
kFalta por
hacer: k
Indice de Materias
(++), 19 foldLeft, 21
foldr, 18
and, 18 foldRight, 17
andLs, 18 foldRosal, 24
aplica, 16 Forma, 10
append, 18 forma normal, 25
Arbol, 16 ft, 3
area, 10 Funcion, 3
call by name, 27 guardas, 6
call by value, 27
comb, 19 hasta, 25
comp, 4
Complejos con representaci
on polar, incEdad, 12
11
LInt, 14
cpares20, 20
Lista, 15
cuboS, 6
llamada por nombre, 27
cuboS1, 6
llamada por valor, 27
cuboS2, 6
long, 15
currificaci
on, 4
longLs, 17
d2b, 23 longLs, 18
derivingShow, 10 ls2n, 21
divisores, 20 map, 16
maxLs, 21
eligeSaludo, 7
mkCarte, 11
estadoNormal, 9
EstadoTemp, 9 N
umeros Complejos, 9
evaluaci
on aplicativa, 25 Nat, 13
evaluaci
on eager, 26
evaluaci
on impaciente, 26 or, 18
evaluaci
on normal, 25 orLs, 18
evaluaci
on perezosa, 27
pals, 23
fact, 5 Par, 13
fc, 4 Persona, 12
fc, 4 prodLs, 17
fcm, 5 prodLs, 18
fcm, 5 prodNat, 14
filter, 19
filtra, 19 Rosal, 16
foldA, 23 ruffini, 22
foldl, 21
signo, 6
29
INDICE DE MATERIAS 30
takeWhile, 19
Temp, 8
tempNormal, 8
Tipo, 7
tomaMientras, 19
unfold, 22
vuelta, 19
zip, 20