Documente Academic
Documente Profesional
Documente Cultură
Informtica (201112)
2 / 36
3 / 36
3 / 36
4 / 36
5 / 36
6 / 36
6 / 36
6 / 36
La funcin sum:
Prelude
sum :: [Int] -> Int
sum []
= 0
sum (x:xs) = x + sum xs
I
7 / 36
La funcin sum:
Prelude
sum :: [Int] -> Int
sum []
= 0
sum (x:xs) = x + sum xs
I
7 / 36
8 / 36
La funcin filter
I
9 / 36
La funcin filter
I
9 / 36
La funcin filter
I
9 / 36
10 / 36
10 / 36
10 / 36
f []
= v
f (x:xs) = x `op` (f xs)
12 / 36
El patrn foldr
I
sum
product
or
and
I
=
=
=
=
foldr
foldr
foldr
foldr
(+) 0
(*) 1
(||) False
(&&) True
Prelude
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f v []
= v
foldr f v (x:xs) = f x (foldr f v xs)
13 / 36
El patrn foldr
I
sum
product
or
and
I
=
=
=
=
foldr
foldr
foldr
foldr
(+) 0
(*) 1
(||) False
(&&) True
Prelude
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f v []
= v
foldr f v (x:xs) = f x (foldr f v xs)
13 / 36
15 / 36
15 / 36
[Sustituciones]
16 / 36
[Sustituciones]
16 / 36
17 / 36
17 / 36
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
12
0 [2,3,7]
(0+2) [3,7]
2 [3,7]
(2+3) [7]
5 [7]
(5+7) []
12 []
18 / 36
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
12
0 [2,3,7]
(0+2) [3,7]
2 [3,7]
(2+3) [7]
5 [7]
(5+7) []
12 []
18 / 36
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
sumaAux
12
0 [2,3,7]
(0+2) [3,7]
2 [3,7]
(2+3) [7]
5 [7]
(5+7) []
12 []
18 / 36
f v []
= v
f v (x:xs) = f (v*x) xs
I
suma
product
or
and
=
=
=
=
foldl
foldl
foldl
foldl
(+) 0
(*) 1
(||) False
(&&) True
19 / 36
Definicin de foldl
I
Definicin de foldl:
Prelude
foldl :: (a -> b -> a) -> a -> [b ] -> a
foldl f v []
= v
foldl f v (x:xs) = foldl f (f v x ) xs
20 / 36
Definicin de foldl
I
Definicin de foldl:
Prelude
foldl :: (a -> b -> a) -> a -> [b ] -> a
foldl f v []
= v
foldl f v (x:xs) = foldl f (f v x ) xs
20 / 36
Composicin de funciones
I
par n
= not (impar n)
doVeces f x
= f (f x )
sumaCuadradosPares ns = sum (map (^2) (filter even ns))
I
par
= not . impar
dosVeces f
= f . f
sumaCuadradosPares = sum . map (^2) . filter even
21 / 36
Composicin de funciones
I
par n
= not (impar n)
doVeces f x
= f (f x )
sumaCuadradosPares ns = sum (map (^2) (filter even ns))
I
par
= not . impar
dosVeces f
= f . f
sumaCuadradosPares = sum . map (^2) . filter even
21 / 36
Composicin de funciones
I
par n
= not (impar n)
doVeces f x
= f (f x )
sumaCuadradosPares ns = sum (map (^2) (filter even ns))
I
par
= not . impar
dosVeces f
= f . f
sumaCuadradosPares = sum . map (^2) . filter even
21 / 36
La funcin identidad:
id :: a -> a
id = \x -> x
I
Prelude
La funcin identidad:
id :: a -> a
id = \x -> x
I
Prelude
Objetivos:
1. Definir una funcin que convierta una cadena en una lista de ceros
y unos junto con otra funcin que realice la conversin opuesta.
2. Simular la transmisin de cadenas mediante ceros y unos.
23 / 36
24 / 36
25 / 36
25 / 36
Comprobacin:
*Main> quickCheck prop_int_bin
+++ OK, passed 100 tests.
27 / 36
Comprobacin:
*Main> quickCheck prop_int_bin
+++ OK, passed 100 tests.
27 / 36
28 / 36
Creacin de octetos
I
I
Codificacin
I
Codificacin
I
Codificacin
I
Ejemplo de codificacin,
codifica "abc"
= concat . map (creaOcteto . int2bin . ord) "abc"
= concat . map (creaOcteto . int2bin . ord) ['a','b','c']
= concat [creaOcteto . int2bin . ord 'a',
creaOcteto . int2bin . ord 'b',
creaOcteto . int2bin . ord 'c']
= concat [creaOcteto [1,0,0,0,0,1,1],
creaOcteto [0,1,0,0,0,1,1],
creaOcteto [1,1,0,0,0,1,1]]
= concat [[1,0,0,0,0,1,1,0],
[0,1,0,0,0,1,1,0],
[1,1,0,0,0,1,1,0]]
= [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]
31 / 36
Separacin de octetos
I
separaOctetos
separaOctetos
separaOctetos
take 8 bs
32 / 36
Separacin de octetos
I
separaOctetos
separaOctetos
separaOctetos
take 8 bs
32 / 36
Descodificacin
I
Por ejemplo,
descodifica [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]
= (map (chr . bin2int) . separaOctetos)
[1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]
= map (chr . bin2int) [[1,0,0,0,0,1,1,0],[0,1,0,0,0,1,1,0],[1,1,0,0,0,1,1,0]
= [(chr . bin2int) [1,0,0,0,0,1,1,0],
(chr . bin2int) [0,1,0,0,0,1,1,0],
(chr . bin2int) [1,1,0,0,0,1,1,0]]
= [chr 97, chr 98, chr 99]
= "abc"
33 / 36
Descodificacin
I
Por ejemplo,
descodifica [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]
= (map (chr . bin2int) . separaOctetos)
[1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]
= map (chr . bin2int) [[1,0,0,0,0,1,1,0],[0,1,0,0,0,1,1,0],[1,1,0,0,0,1,1,0]
= [(chr . bin2int) [1,0,0,0,0,1,1,0],
(chr . bin2int) [0,1,0,0,0,1,1,0],
(chr . bin2int) [1,1,0,0,0,1,1,0]]
= [chr 97, chr 98, chr 99]
= "abc"
33 / 36
Transmisin
I
34 / 36
Correccin de la transmisin
I
Comprobacin de la correccin:
*Main> quickCheck prop_transmite
+++ OK, passed 100 tests.
35 / 36
Correccin de la transmisin
I
Comprobacin de la correccin:
*Main> quickCheck prop_transmite
+++ OK, passed 100 tests.
35 / 36
Bibliografa
1. R. Bird. Introduccin a la programacin funcional con Haskell.
Prentice Hall, 2000.
I
Cap. 4: Listas.
36 / 36