SlideShare una empresa de Scribd logo
Tema 7: Funciones de orden superior
            Informática (2010–11)


            José A. Alonso Jiménez

          Grupo de Lógica Computacional
  Departamento de Ciencias de la Computación e I.A.
               Universidad de Sevilla
IM Tema 7: Funciones de orden superior




Tema 7: Funciones de orden superior
 1. Funciones de orden superior

 2. Procesamiento de listas
       La función map
       La función filter

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
       Cambio de bases
       Codificación y descodificación

                                                                    2 / 42
IM Tema 7: Funciones de orden superior
  Funciones de orden superior




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas


                                                                    3 / 42
IM Tema 7: Funciones de orden superior
  Funciones de orden superior




Funciones de orden superior
         Una función es de orden superior si toma una función como
         argumento o devuelve una función como resultado.
         (dosVeces f x) es el resultado de aplicar f a f x. Por ejemplo,
          dosVeces (*3) 2                      18
          dosVeces reverse [2,5,7]             [2,5,7]

         dosVeces :: (a -> a) -> a -> a
         dosVeces f x = f (f x)
         Prop: dosVeces reverse = id
         donde id es la función identidad.
                                     Prelude
         id :: a -> a
         id x = x
                                                                           4 / 42
IM Tema 7: Funciones de orden superior
  Funciones de orden superior




Usos de las funciones de orden superior
         Definición de patrones de programación.
                 Aplicación de una función a todos los elementos de una lista.
                 Filtrado de listas por propiedades.
                 Patrones de recursión sobre listas.
         Diseño de lenguajes de dominio específico:
                 Lenguajes para procesamiento de mensajes.
                 Analizadores sintácticos.
                 Procedimientos de entrada/salida.
         Uso de las propiedades algebraicas de las funciones de orden
         superior para razonar sobre programas.




                                                                                 5 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas
       La función map
       La función filter

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
                                                                    6 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función map



Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas
       La función map
       La función filter

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
                                                                    7 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función map



La función map: Definición
         (map f xs) es la lista obtenida aplicando f a cada elemento de
         xs. Por ejemplo,
          map (*2) [3,4,7]             [6,8,14]
          map sqrt [1,2,4]             [1.0,1.4142135623731,2.0]
          map even [1..5]              [False,True,False,True,False]
         Definición de map por comprensión:

         map :: (a -> b) -> [a] -> [b]
         map f xs = [f x | x <- xs]
         Definición de map por recursión:
                                    Prelude
         map :: (a -> b) -> [a] -> [b]
         map _ []       = []
         map f (x:xs) = f x : map f xs
                                                                          8 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función map



Relación entre sum y map
         La función sum:
                                Prelude
         sum :: [Int] -> Int
         sum []     = 0
         sum (x:xs) = x + sum xs

         Propiedad: sum (map (2*) xs) = 2 * sum xs
         Comprobación con QuickCheck:

         prop_sum_map :: [Int] -> Bool
         prop_sum_map xs = sum (map (2*) xs) == 2 * sum xs

           *Main> quickCheck prop_sum_map
           +++ OK, passed 100 tests.
                                                             9 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función filter



Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas
       La función map
       La función filter

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
                                                                    10 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función filter



La función filter
         filter p xs es la lista de los elementos de xs que cumplen la
         propiedad p. Por ejemplo,
          filter even [1,3,5,4,2,6,1]          [4,2,6]
          filter (>3) [1,3,5,4,2,6,1]          [5,4,6]
         Definición de filter por comprensión:

         filter :: (a -> Bool) -> [a] -> [a]
         filter p xs = [x | x <- xs, p x]
         Definición de filter por recursión:
                                   Prelude
         filter :: (a -> Bool) -> [a] -> [a]
         filter _ []                      = []
         filter p (x:xs) | p x            = x : filter p xs
                           | otherwise = filter p xs
                                                                         11 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función filter



Uso conjunto de map y filter
         sumaCuadradosPares xs es la suma de los cuadrados de los
         números pares de la lista xs. Por ejemplo,
          sumaCuadradosPares [1..5]             20

         sumaCuadradosPares :: [Int] -> Int
         sumaCuadradosPares xs = sum (map (^2) (filter even xs))

         Definición por comprensión:

         sumaCuadradosPares' :: [Int] -> Int
         sumaCuadradosPares' xs = sum [x^2 | x <- xs, even x]




                                                                    12 / 42
IM Tema 7: Funciones de orden superior
  Procesamiento de listas
     La función filter



Predefinidas de orden superior para procesar listas
         all p xs se verifica si todos los elementos de xs cumplen la
         propiedad p. Por ejemplo,
          all odd [1,3,5]           True
          all odd [1,3,6]           False
         any p xs se verifica si algún elemento de xs cumple la
         propiedad p. Por ejemplo,
          any odd [1,3,5]           True
          any odd [2,4,6]           False
         takeWhile p xs es la lista de los elementos iniciales de xs que
         verifican el predicado p. Por ejemplo,
          takeWhile even [2,4,6,7,8,9]           [2,4,6]
         dropWhile p xs es la lista xs sin los elementos iniciales que
         verifican el predicado p. Por ejemplo,
          dropWhile even [2,4,6,7,8,9]           [7,8,9]
                                                                           13 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas


                                                                    14 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Esquema básico de recursión sobre listas
         Ejemplos de definiciones recursivas:
                                    Prelude
         sum []           = 0
         sum (x:xs)       = x + sum xs
         product []       = 1
         product (x:xs) = x * product xs
         or []            = False
         or (x:xs)        = x || or xs
         and []           = True
         and (x:xs)       = x && and xs
         Esquema básico de recursión sobre listas:

         f []     = v
         f (x:xs) = x `op` (f xs)
                                                     15 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




El patrón foldr
         Redefiniciones con el patrón foldr

         sum             =   foldr       (+) 0
         product         =   foldr       (*) 1
         or              =   foldr       (||) False
         and             =   foldr       (&&) True
         Definición del patrón foldr
                                Prelude
         foldr :: (a -> b -> b) -> b -> [a] -> b
         foldr f v []     = v
         foldr f v (x:xs) = f x (foldr f v xs)



                                                      16 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Visión no recursiva de foldr
         Cálculo con sum:
          sum [2,3,5]
          = foldr (+) 0 [2,3,5]              [def. de sum]
          = foldr (+) 0 2:(3:(5:[])) [notación de lista]
          =                  2+(3+(5+0))     [sustituir (:) por (+) y [] por 0]
          = 10                               [aritmética]
         Cálculo con sum:
          product [2,3,5]
          = foldr (*) 1 [2,3,5]              [def. de sum]
          = foldr (*) 1 2:(3:(5:[])) [notación de lista]
          =                  2*(3*(5*1))     [sustituir (:) por (*) y [] por 1]
          = 30                               [aritmética]
         Cálculo de foldr f v xs
         Sustituir en xs los (:) por f y [] por v.
                                                                           17 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Definición de la longitud mediante foldr
         Ejemplo de cálculo de la longitud:
            longitud [2,3,5]
          = longitud 2:(3:(5:[]))
          =             1+(1+(1+0))         [Sustituciones]
          = 3
         Sustituciones:
                 los (:) por (_ n -> 1+n)
                 la [] por 0
         Definición de length usando foldr

         longitud :: [a] -> Int
         longitud = foldr (_ n -> 1+n) 0


                                                              18 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Definición de la inversa mediante foldr
         Ejemplo de cálculo de la inversa:
            inversa [2,3,5]
          = inversa 2:(3:(5:[]))
          =            (([] ++ [5]) ++ [3]) ++ [2]   [Sustituciones]
          = [5,3,2]
         Sustituciones:
                 los (:) por (x xs -> xs ++ [x])
                 la [] por []
         Definición de inversa usando foldr

         inversa :: [a] -> [a]
         inversa = foldr (x xs -> xs ++ [x]) []


                                                                   19 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la derecha: foldr




Definición de la concatenación mediante foldr
         Ejemplo de cálculo de la concatenación:
            conc [2,3,5] [7,9]
          = conc 2:(3:(5:[])) [7,9]
          =        2:(3:(5:[7,9]))           [Sustituciones]
          = [2,3,5,7,9]
         Sustituciones:
                 los (:) por (:)
                 la [] por ys
         Definición de conc usando foldr

         conc xs ys = (foldr (:) ys) xs



                                                               20 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la izquierda: foldl




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas


                                                                    21 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la izquierda: foldl




Definición de suma de lista con acumuladores
         Definición de suma con acumuladores:

         suma :: [Integer] -> Integer
         suma = sumaAux 0
             where sumaAux v []     = v
                   sumaAux v (x:xs) = sumaAux (v+x) xs
         Cálculo con suma:
            suma [2,3,7] =                     sumaAux   0 [2,3,7]
                           =                   sumaAux   (0+2) [3,7]
                           =                   sumaAux   2 [3,7]
                           =                   sumaAux   (2+3) [7]
                           =                   sumaAux   5 [7]
                           =                   sumaAux   (5+7) []
                           =                   sumaAux   12 []
                           =                   12                      22 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la izquierda: foldl




Patrón de definición de recursión con acumulador
         Patrón de definición (generalización de sumaAux):

         f v []     = v
         f v (x:xs) = f (v*x) xs
         Definición con el patrón foldl:

         suma            =   foldl       (+) 0
         product         =   foldl       (*) 1
         or              =   foldl       (||) False
         and             =   foldl       (&&) True




                                                            23 / 42
IM Tema 7: Funciones de orden superior
  Función de plegado por la izquierda: foldl




Definición de foldl
         Definición 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




                                                    24 / 42
IM Tema 7: Funciones de orden superior
  Composición de funciones




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas


                                                                    25 / 42
IM Tema 7: Funciones de orden superior
  Composición de funciones




Composición de funciones
         Definición de la composición de dos funciones:
                                    Prelude
         (.) :: (b -> c) -> (a -> b) -> a -> c
         f . g = x -> f (g x)
         Uso de composición para simplificar definiciones:
                 Definiciones sin composición:

                 par n                 = not (impar n)
                 doVeces f x           = f (f x )
                 sumaCuadradosPares ns = sum (map (^2) (filter even ns))
                 Definiciones con composición:

                 par                = not . impar
                 dosVeces f         = f . f
                 sumaCuadradosPares = sum . map (^2) . filter even   26 / 42
IM Tema 7: Funciones de orden superior
  Composición de funciones




Composición de una lista de funciones
         La función identidad:
                                         Prelude
         id :: a -> a
         id = x -> x

         (composicionLista fs) es la composición de la lista de
         funciones fs. Por ejemplo,
          composicionLista [(*2),(^2)] 3                18
          composicionLista [(^2),(*2)] 3                36
          composicionLista [(/9),(^2),(*2)] 3           4.0

         composicionLista :: [a -> a] -> (a -> a)
         composicionLista = foldr (.) id

                                                                  27 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas




Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
       Cambio de bases
       Codificación y descodificación
                                                                    28 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas




Caso de estudio: Codificación binaria y transmisión de
cadenas
         Objetivos:
            1. Definir una función que convierta una cadena en una lista de ceros
               y unos junto con otra función que realice la conversión opuesta.
            2. Simular la transmisión de cadenas mediante ceros y unos.
         Los números binarios se representan mediante listas de bits en
         orden inverso. Un bit es cero o uno. Por ejemplo, el número 1101
         se representa por [1,0,1,1].
         El tipo Bit es el de los bits.

         type Bit = Int



                                                                                   29 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Cambio de bases



Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
       Cambio de bases
       Codificación y descodificación
                                                                    30 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Cambio de bases



Cambio de bases: De binario a decimal
         (bin2int x) es el número decimal correspondiente al número
         binario x. Por ejemplo,
          bin2int [1,0,1,1]         13
         El cálculo es
             bin2int [1,0,1,1]
          = bin2int 1:(0:(1:(1:[])))
          =            1+2*(0+2*(1+2*(1+2*0)))
          = 13

         bin2int :: [Bit] -> Int
         bin2int = foldr (x y -> x + 2*y) 0



                                                                      31 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Cambio de bases



Cambio de base: De decimal a binario
       (int2bin x) es el número binario correspondiente al número
       decimal x. Por ejemplo,
        int2bin 13         [1,0,1,1]

       int2bin :: Int -> [Bit]
       int2bin 0 = []
       int2bin n = n `mod` 2 : int2bin (n `div` 2)

       Por ejemplo,
          int2bin 13
        = 13 `mod` 2 : int2bin (13 `div` 2)
        = 1 : int2bin (6 `div` 2)
        = 1 : (6 `mod` 2 : int2bin (6 `div` 2))
        = 1 : (0 : int2bin 3)
        = 1 : (0 : (3 `mod` 2 : int2bin (3 `div` 2)))
        = 1 : (0 : (1 : int2bin 1))
        = 1 : (0 : (1 : (1 : int2bin 0)))
        = 1 : (0 : (1 : (1 : [])))
        = [1,0,1,1]
                                                                    32 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Cambio de bases



Cambio de base: Comprobación de propiedades
         Propiedad: Al pasar un número natural a binario con int2bin y
         el resultado a decimal con bin2int se obtiene el número inicial.

         prop_int_bin :: Int -> Bool
         prop_int_bin x =
             bin2int (int2bin y) == y
             where y = abs x

         Comprobación:
          *Main> quickCheck prop_int_bin
          +++ OK, passed 100 tests.




                                                                            33 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Tema 7: Funciones de orden superior

 1. Funciones de orden superior

 2. Procesamiento de listas

 3. Función de plegado por la derecha: foldr

 4. Función de plegado por la izquierda: foldl

 5. Composición de funciones

 6. Caso de estudio: Codificación binaria y transmisión de cadenas
       Cambio de bases
       Codificación y descodificación
                                                                    34 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Creación de octetos
         Un octeto es un grupo de ocho bits.
         (creaOcteto bs) es el octeto correspondiente a la lista de bits
         bs; es decir, los 8 primeros elementos de bs si su longitud es
         mayor o igual que 8 y la lista de 8 elemento añadiendo ceros al
         final de bs en caso contrario. Por ejemplo,
          Main*> creaOcteto [1,0,1,1,0,0,1,1,1,0,0,0]
          [1,0,1,1,0,0,1,1]
          Main*> creaOcteto [1,0,1,1]
          [1,0,1,1,0,0,0,0]

         creaOcteto :: [Bit] -> [Bit]
         creaOcteto bs = take 8 (bs ++ repeat 0)

         donde (repeat x) es una lista infinita cuyo único elemento es x.
                                                                           35 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Codificación
         (codifica c) es la codificación de la cadena c como una lista
         de bits obtenida convirtiendo cada carácter en un número
         Unicode, convirtiendo cada uno de dichos números en un octeto
         y concatenando los octetos para obtener una lista de bits. Por
         ejemplo,
          *Main> codifica "abc"
          [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0]

         codifica :: String -> [Bit]
         codifica = concat . map (creaOcteto . int2bin . ord)

         donde (concat xss) es la lista obtenida concatenando la lista
         de listas xss.

                                                                          36 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Codificación
         Ejemplo de codificación,
            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]
                                                                  37 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Separación de octetos
         (separaOctetos bs) es la lista obtenida separando la lista de
         bits bs en listas de 8 elementos. Por ejemplo,
          *Main> separaOctetos [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0]
          [[1,0,0,0,0,1,1,0],[0,1,0,0,0,1,1,0]]

         separaOctetos               :: [Bit] -> [[Bit]]
         separaOctetos               [] = []
         separaOctetos               bs =
             take 8 bs               : separaOctetos (drop 8 bs)




                                                                     38 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Descodificación
       (descodifica bs) es la cadena correspondiente a la lista de bits
       bs. Por ejemplo,
        *Main> 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]
        "abc"

       descodifica :: [Bit] -> String
       descodifica = map (chr . bin2int) . separaOctetos

       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"
                                                                               39 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Transmisión
         Los canales de transmisión pueden representarse mediante
         funciones que transforman cadenas de bits en cadenas de bits.
         (transmite c t) es la cadena obtenida transmitiendo la
         cadena t a través del canal c. Por ejemplo,
          *Main> transmite id "Texto por canal correcto"
          "Texto por canal correcto"

         transmite :: ([Bit] -> [Bit]) -> String -> String
         transmite canal = descodifica . canal . codifica




                                                                         40 / 42
IM Tema 7: Funciones de orden superior
  Caso de estudio: Codificación binaria y transmisión de cadenas
     Codificación y descodificación



Corrección de la transmisión
         Propiedad: Al trasmitir cualquier cadena por el canal identidad se
         obtiene la cadena.

         prop_transmite :: String -> Bool
         prop_transmite cs =
             transmite id cs == cs
         Comprobación de la corrección:
          *Main> quickCheck prop_transmite
          +++ OK, passed 100 tests.




                                                                              41 / 42
IM Tema 7: Funciones de orden superior
  Bibliografía




Bibliografía
    1. R. Bird. Introducción a la programación funcional con Haskell.
       Prentice Hall, 2000.
                 Cap. 4: Listas.
    2. G. Hutton Programming in Haskell. Cambridge University Press,
       2007.
                 Cap. 7: Higher-order functions.
    3. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando
       con Haskell. Thompson, 2004.
                 Cap. 8: Funciones de orden superior y polimorfismo.
    4. S. Thompson. Haskell: The Craft of Functional Programming,
       Second Edition. Addison-Wesley, 1999.
                 Cap. 9: Generalization: patterns of computation.
                 Cap. 10: Functions as values.


                                                                         42 / 42

Más contenido relacionado

PDF
Ejercicios resueltos en el Laboratorio de estructuras struct registros
PDF
Procesos e Hilos
PPTX
Ciclo de instrucciones CPU
PDF
Diseño logico de una base de datos
PPTX
Normalización de Base de Datos
PPTX
Polimorfismo en Java
PPTX
PARADIGMA IMPERATIVO
Ejercicios resueltos en el Laboratorio de estructuras struct registros
Procesos e Hilos
Ciclo de instrucciones CPU
Diseño logico de una base de datos
Normalización de Base de Datos
Polimorfismo en Java
PARADIGMA IMPERATIVO

La actualidad más candente (20)

PPTX
Diseño fisico
PPT
Notación infija postfija
PDF
Manejo de archivos en java
PDF
RETO 1. Calculadora PSEINT
PPTX
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
PDF
Transacciones y sql procedural EN MySQL
PDF
Visual Basic 6.0
PDF
Arquitectura de Cómputo Paralelo MISD
DOCX
Comandos java
PPT
Procesos
PPT
Manejo de memoria
PPTX
Origen del Modelo OSI y su impacto en als estructuras de redes
PDF
Normalizacion de base de datos
DOCX
59563233 algoritmo-bresenham
PPT
Automata Finito No Determinista
PPTX
Unidad 2-servidores-con-software-propietario
PPTX
Tipos de listas en estructura de datos
PPTX
Programación lógica y funcional
PDF
10.Polimorfismo Java
Diseño fisico
Notación infija postfija
Manejo de archivos en java
RETO 1. Calculadora PSEINT
Estructura de datos - Unidad 1: Introducción a las estructuras de datos
Transacciones y sql procedural EN MySQL
Visual Basic 6.0
Arquitectura de Cómputo Paralelo MISD
Comandos java
Procesos
Manejo de memoria
Origen del Modelo OSI y su impacto en als estructuras de redes
Normalizacion de base de datos
59563233 algoritmo-bresenham
Automata Finito No Determinista
Unidad 2-servidores-con-software-propietario
Tipos de listas en estructura de datos
Programación lógica y funcional
10.Polimorfismo Java
Publicidad

Destacado (18)

PDF
Tema 3: Tipos y clases en Haskell
PDF
LI -T5: Resolución proposicional
PDF
I1M2011-T4: Definición de funciones en Haskell
DOC
Tipos De Datos Lisp
PDF
LI2011-T9: Formas normales de Skolem y cláusulas
PPTX
Tipos de lenguaje de programacion part 1
DOCX
Tipos de programacion
PPT
Redes Y Seguridad InformáTica
PDF
Programación funcional con haskell
DOCX
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
PDF
Tema 9: Declaraciones de tipos y clases en Haskell
PPSX
Programación estructurada presentación
PDF
Importancia De La ProgramacióN Estructurada
PDF
Tema 6: Definiciones por recursión en Haskell
PPTX
TIPOS DE ESTRUCTURAS DE PROGRAMACION
PPT
Programación Modular y Estructyrada
PPTX
Tipos de lenguaje de programacion
PDF
MANUAL DE FUNCIONES Y MANUAL DE PROCEDIMIENTOS EMPRESA: COMERCIAL NUTRESA S.A.S
Tema 3: Tipos y clases en Haskell
LI -T5: Resolución proposicional
I1M2011-T4: Definición de funciones en Haskell
Tipos De Datos Lisp
LI2011-T9: Formas normales de Skolem y cláusulas
Tipos de lenguaje de programacion part 1
Tipos de programacion
Redes Y Seguridad InformáTica
Programación funcional con haskell
2.1 elemento básicos del lenguaje de programación estructurado manipulación b...
Tema 9: Declaraciones de tipos y clases en Haskell
Programación estructurada presentación
Importancia De La ProgramacióN Estructurada
Tema 6: Definiciones por recursión en Haskell
TIPOS DE ESTRUCTURAS DE PROGRAMACION
Programación Modular y Estructyrada
Tipos de lenguaje de programacion
MANUAL DE FUNCIONES Y MANUAL DE PROCEDIMIENTOS EMPRESA: COMERCIAL NUTRESA S.A.S
Publicidad

Similar a Tema 7: Funciones de orden superior en Haskell (20)

PPT
Electrónica digital
PDF
Tema 11: Aplicaciones de la programación funcional con Haskell
PDF
Tema 1: Introducción a la programación funcional.
PDF
ReferenciaPython.pdf
PPT
Metodología y Tecnología de la Programación I (II Bimestre)
PPT
Funciones inicio
PPT
Funciones inicio
PDF
Apunte clase
PPT
Segundo Bimestre
PDF
Ejercicios programacion prolog
DOCX
Instituto universitario de tecnología
PDF
Subporgramacion
PDF
Subporgramacion
ODP
Electrónica: circuitos combinacionales
PPT
PPT
Video Segundo Bimestre Metodologia Abierta
PPT
METODOLOGIA Y TECNOLOGIA DE LA PROGRAMACION I
PPT
PDF
Unidad colecciones, python, espol, segundo parcial
PDF
lazy evaluation parte2 - temas avanzado.pdf
Electrónica digital
Tema 11: Aplicaciones de la programación funcional con Haskell
Tema 1: Introducción a la programación funcional.
ReferenciaPython.pdf
Metodología y Tecnología de la Programación I (II Bimestre)
Funciones inicio
Funciones inicio
Apunte clase
Segundo Bimestre
Ejercicios programacion prolog
Instituto universitario de tecnología
Subporgramacion
Subporgramacion
Electrónica: circuitos combinacionales
Video Segundo Bimestre Metodologia Abierta
METODOLOGIA Y TECNOLOGIA DE LA PROGRAMACION I
Unidad colecciones, python, espol, segundo parcial
lazy evaluation parte2 - temas avanzado.pdf

Más de José A. Alonso (20)

PDF
Tema 12: Analizadores sintácticos funcionales.
PDF
Tema 23: Técnicas de diseño descendente de algoritmos
PDF
I1M-T19: El TAD de los árboles de búsqueda
PDF
I1M-T17: El TAD de los conjuntos
PDF
Panorama de la demostración asistida por ordenador
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LMF-T5b: Aplicaciones de la lógica proposicional
PDF
LMF-T5: Resolución proposicional
PDF
LMF-T4: Formas normales
PDF
LMF-T3: Tableros semánticos
PDF
LMF-T2: Deducción natural proposicional
PDF
I1M-T21: El TAD de los polinomios en Haskell
PDF
LMF-T1: Sintaxis y semántica de la lógica proposicional
PDF
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
PDF
LI-T6: Sintaxis y semántica de la lógica de primer orden
PDF
LI-T5b: Algoritmos para SAT. Aplicaciones
PDF
Panorama del razonamiento automático
PDF
I1M2010-T24: Programación dinámica en Haskell
PDF
LI2011-T11: Resolución en lógica de primer orden
Tema 12: Analizadores sintácticos funcionales.
Tema 23: Técnicas de diseño descendente de algoritmos
I1M-T19: El TAD de los árboles de búsqueda
I1M-T17: El TAD de los conjuntos
Panorama de la demostración asistida por ordenador
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T6: Sintaxis y semántica de la lógica de primer orden
LMF-T5b: Aplicaciones de la lógica proposicional
LMF-T5: Resolución proposicional
LMF-T4: Formas normales
LMF-T3: Tableros semánticos
LMF-T2: Deducción natural proposicional
I1M-T21: El TAD de los polinomios en Haskell
LMF-T1: Sintaxis y semántica de la lógica proposicional
LI-T12: LI2011-12: Introducción a la programación lógica con Prolog
LI-T6: Sintaxis y semántica de la lógica de primer orden
LI-T5b: Algoritmos para SAT. Aplicaciones
Panorama del razonamiento automático
I1M2010-T24: Programación dinámica en Haskell
LI2011-T11: Resolución en lógica de primer orden

Último (20)

PDF
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
PDF
IPERC...................................
PDF
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
DOC
Manual de Convivencia 2025 actualizado a las normas vigentes
PDF
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
PDF
Introducción a la historia de la filosofía
PDF
Esc. Sab. Lección 7. El pan y el agua de vida.pdf
PDF
LIBRO 2-SALUD Y AMBIENTE-4TO CEBA avanzado.pdf
PDF
Escuelas Desarmando una mirada subjetiva a la educación
DOCX
PLAN DE CASTELLANO 2021 actualizado a la normativa
PDF
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
PDF
La Inteligencia Emocional - Fabian Goleman TE4 Ccesa007.pdf
DOCX
Informe_practica pre Final.docxddadssasdddddddddddddddddddddddddddddddddddddddd
PDF
Ernst Cassirer - Antropologia Filosofica.pdf
PPTX
Doctrina 1 Soteriologuia y sus diferente
PDF
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
PDF
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
DOCX
Programa_Sintetico_Fase_4.docx 3° Y 4°..
PDF
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE.pdf
DOCX
V UNIDAD - PRIMER GRADO. del mes de agosto
Gasista de unidades unifuncionales - pagina 23 en adelante.pdf
IPERC...................................
Integrando la Inteligencia Artificial Generativa (IAG) en el Aula
Manual de Convivencia 2025 actualizado a las normas vigentes
IDH_Guatemala_2.pdfnjjjkeioooe ,l dkdldp ekooe
Introducción a la historia de la filosofía
Esc. Sab. Lección 7. El pan y el agua de vida.pdf
LIBRO 2-SALUD Y AMBIENTE-4TO CEBA avanzado.pdf
Escuelas Desarmando una mirada subjetiva a la educación
PLAN DE CASTELLANO 2021 actualizado a la normativa
Unidad de Aprendizaje 5 de Matematica 1ro Secundaria Ccesa007.pdf
La Inteligencia Emocional - Fabian Goleman TE4 Ccesa007.pdf
Informe_practica pre Final.docxddadssasdddddddddddddddddddddddddddddddddddddddd
Ernst Cassirer - Antropologia Filosofica.pdf
Doctrina 1 Soteriologuia y sus diferente
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
el - LIBRO-PACTO-EDUCATIVO-GLOBAL-OIEC.pdf
Programa_Sintetico_Fase_4.docx 3° Y 4°..
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE.pdf
V UNIDAD - PRIMER GRADO. del mes de agosto

Tema 7: Funciones de orden superior en Haskell

  • 1. Tema 7: Funciones de orden superior Informática (2010–11) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla
  • 2. IM Tema 7: Funciones de orden superior Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas La función map La función filter 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Codificación y descodificación 2 / 42
  • 3. IM Tema 7: Funciones de orden superior Funciones de orden superior Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 3 / 42
  • 4. IM Tema 7: Funciones de orden superior Funciones de orden superior Funciones de orden superior Una función es de orden superior si toma una función como argumento o devuelve una función como resultado. (dosVeces f x) es el resultado de aplicar f a f x. Por ejemplo, dosVeces (*3) 2 18 dosVeces reverse [2,5,7] [2,5,7] dosVeces :: (a -> a) -> a -> a dosVeces f x = f (f x) Prop: dosVeces reverse = id donde id es la función identidad. Prelude id :: a -> a id x = x 4 / 42
  • 5. IM Tema 7: Funciones de orden superior Funciones de orden superior Usos de las funciones de orden superior Definición de patrones de programación. Aplicación de una función a todos los elementos de una lista. Filtrado de listas por propiedades. Patrones de recursión sobre listas. Diseño de lenguajes de dominio específico: Lenguajes para procesamiento de mensajes. Analizadores sintácticos. Procedimientos de entrada/salida. Uso de las propiedades algebraicas de las funciones de orden superior para razonar sobre programas. 5 / 42
  • 6. IM Tema 7: Funciones de orden superior Procesamiento de listas Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas La función map La función filter 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 6 / 42
  • 7. IM Tema 7: Funciones de orden superior Procesamiento de listas La función map Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas La función map La función filter 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 7 / 42
  • 8. IM Tema 7: Funciones de orden superior Procesamiento de listas La función map La función map: Definición (map f xs) es la lista obtenida aplicando f a cada elemento de xs. Por ejemplo, map (*2) [3,4,7] [6,8,14] map sqrt [1,2,4] [1.0,1.4142135623731,2.0] map even [1..5] [False,True,False,True,False] Definición de map por comprensión: map :: (a -> b) -> [a] -> [b] map f xs = [f x | x <- xs] Definición de map por recursión: Prelude map :: (a -> b) -> [a] -> [b] map _ [] = [] map f (x:xs) = f x : map f xs 8 / 42
  • 9. IM Tema 7: Funciones de orden superior Procesamiento de listas La función map Relación entre sum y map La función sum: Prelude sum :: [Int] -> Int sum [] = 0 sum (x:xs) = x + sum xs Propiedad: sum (map (2*) xs) = 2 * sum xs Comprobación con QuickCheck: prop_sum_map :: [Int] -> Bool prop_sum_map xs = sum (map (2*) xs) == 2 * sum xs *Main> quickCheck prop_sum_map +++ OK, passed 100 tests. 9 / 42
  • 10. IM Tema 7: Funciones de orden superior Procesamiento de listas La función filter Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas La función map La función filter 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 10 / 42
  • 11. IM Tema 7: Funciones de orden superior Procesamiento de listas La función filter La función filter filter p xs es la lista de los elementos de xs que cumplen la propiedad p. Por ejemplo, filter even [1,3,5,4,2,6,1] [4,2,6] filter (>3) [1,3,5,4,2,6,1] [5,4,6] Definición de filter por comprensión: filter :: (a -> Bool) -> [a] -> [a] filter p xs = [x | x <- xs, p x] Definición de filter por recursión: Prelude filter :: (a -> Bool) -> [a] -> [a] filter _ [] = [] filter p (x:xs) | p x = x : filter p xs | otherwise = filter p xs 11 / 42
  • 12. IM Tema 7: Funciones de orden superior Procesamiento de listas La función filter Uso conjunto de map y filter sumaCuadradosPares xs es la suma de los cuadrados de los números pares de la lista xs. Por ejemplo, sumaCuadradosPares [1..5] 20 sumaCuadradosPares :: [Int] -> Int sumaCuadradosPares xs = sum (map (^2) (filter even xs)) Definición por comprensión: sumaCuadradosPares' :: [Int] -> Int sumaCuadradosPares' xs = sum [x^2 | x <- xs, even x] 12 / 42
  • 13. IM Tema 7: Funciones de orden superior Procesamiento de listas La función filter Predefinidas de orden superior para procesar listas all p xs se verifica si todos los elementos de xs cumplen la propiedad p. Por ejemplo, all odd [1,3,5] True all odd [1,3,6] False any p xs se verifica si algún elemento de xs cumple la propiedad p. Por ejemplo, any odd [1,3,5] True any odd [2,4,6] False takeWhile p xs es la lista de los elementos iniciales de xs que verifican el predicado p. Por ejemplo, takeWhile even [2,4,6,7,8,9] [2,4,6] dropWhile p xs es la lista xs sin los elementos iniciales que verifican el predicado p. Por ejemplo, dropWhile even [2,4,6,7,8,9] [7,8,9] 13 / 42
  • 14. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 14 / 42
  • 15. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Esquema básico de recursión sobre listas Ejemplos de definiciones recursivas: Prelude sum [] = 0 sum (x:xs) = x + sum xs product [] = 1 product (x:xs) = x * product xs or [] = False or (x:xs) = x || or xs and [] = True and (x:xs) = x && and xs Esquema básico de recursión sobre listas: f [] = v f (x:xs) = x `op` (f xs) 15 / 42
  • 16. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr El patrón foldr Redefiniciones con el patrón foldr sum = foldr (+) 0 product = foldr (*) 1 or = foldr (||) False and = foldr (&&) True Definición del patrón foldr Prelude foldr :: (a -> b -> b) -> b -> [a] -> b foldr f v [] = v foldr f v (x:xs) = f x (foldr f v xs) 16 / 42
  • 17. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Visión no recursiva de foldr Cálculo con sum: sum [2,3,5] = foldr (+) 0 [2,3,5] [def. de sum] = foldr (+) 0 2:(3:(5:[])) [notación de lista] = 2+(3+(5+0)) [sustituir (:) por (+) y [] por 0] = 10 [aritmética] Cálculo con sum: product [2,3,5] = foldr (*) 1 [2,3,5] [def. de sum] = foldr (*) 1 2:(3:(5:[])) [notación de lista] = 2*(3*(5*1)) [sustituir (:) por (*) y [] por 1] = 30 [aritmética] Cálculo de foldr f v xs Sustituir en xs los (:) por f y [] por v. 17 / 42
  • 18. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Definición de la longitud mediante foldr Ejemplo de cálculo de la longitud: longitud [2,3,5] = longitud 2:(3:(5:[])) = 1+(1+(1+0)) [Sustituciones] = 3 Sustituciones: los (:) por (_ n -> 1+n) la [] por 0 Definición de length usando foldr longitud :: [a] -> Int longitud = foldr (_ n -> 1+n) 0 18 / 42
  • 19. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Definición de la inversa mediante foldr Ejemplo de cálculo de la inversa: inversa [2,3,5] = inversa 2:(3:(5:[])) = (([] ++ [5]) ++ [3]) ++ [2] [Sustituciones] = [5,3,2] Sustituciones: los (:) por (x xs -> xs ++ [x]) la [] por [] Definición de inversa usando foldr inversa :: [a] -> [a] inversa = foldr (x xs -> xs ++ [x]) [] 19 / 42
  • 20. IM Tema 7: Funciones de orden superior Función de plegado por la derecha: foldr Definición de la concatenación mediante foldr Ejemplo de cálculo de la concatenación: conc [2,3,5] [7,9] = conc 2:(3:(5:[])) [7,9] = 2:(3:(5:[7,9])) [Sustituciones] = [2,3,5,7,9] Sustituciones: los (:) por (:) la [] por ys Definición de conc usando foldr conc xs ys = (foldr (:) ys) xs 20 / 42
  • 21. IM Tema 7: Funciones de orden superior Función de plegado por la izquierda: foldl Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 21 / 42
  • 22. IM Tema 7: Funciones de orden superior Función de plegado por la izquierda: foldl Definición de suma de lista con acumuladores Definición de suma con acumuladores: suma :: [Integer] -> Integer suma = sumaAux 0 where sumaAux v [] = v sumaAux v (x:xs) = sumaAux (v+x) xs Cálculo con suma: suma [2,3,7] = sumaAux 0 [2,3,7] = sumaAux (0+2) [3,7] = sumaAux 2 [3,7] = sumaAux (2+3) [7] = sumaAux 5 [7] = sumaAux (5+7) [] = sumaAux 12 [] = 12 22 / 42
  • 23. IM Tema 7: Funciones de orden superior Función de plegado por la izquierda: foldl Patrón de definición de recursión con acumulador Patrón de definición (generalización de sumaAux): f v [] = v f v (x:xs) = f (v*x) xs Definición con el patrón foldl: suma = foldl (+) 0 product = foldl (*) 1 or = foldl (||) False and = foldl (&&) True 23 / 42
  • 24. IM Tema 7: Funciones de orden superior Función de plegado por la izquierda: foldl Definición de foldl Definición 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 24 / 42
  • 25. IM Tema 7: Funciones de orden superior Composición de funciones Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas 25 / 42
  • 26. IM Tema 7: Funciones de orden superior Composición de funciones Composición de funciones Definición de la composición de dos funciones: Prelude (.) :: (b -> c) -> (a -> b) -> a -> c f . g = x -> f (g x) Uso de composición para simplificar definiciones: Definiciones sin composición: par n = not (impar n) doVeces f x = f (f x ) sumaCuadradosPares ns = sum (map (^2) (filter even ns)) Definiciones con composición: par = not . impar dosVeces f = f . f sumaCuadradosPares = sum . map (^2) . filter even 26 / 42
  • 27. IM Tema 7: Funciones de orden superior Composición de funciones Composición de una lista de funciones La función identidad: Prelude id :: a -> a id = x -> x (composicionLista fs) es la composición de la lista de funciones fs. Por ejemplo, composicionLista [(*2),(^2)] 3 18 composicionLista [(^2),(*2)] 3 36 composicionLista [(/9),(^2),(*2)] 3 4.0 composicionLista :: [a -> a] -> (a -> a) composicionLista = foldr (.) id 27 / 42
  • 28. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Codificación y descodificación 28 / 42
  • 29. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Caso de estudio: Codificación binaria y transmisión de cadenas Objetivos: 1. Definir una función que convierta una cadena en una lista de ceros y unos junto con otra función que realice la conversión opuesta. 2. Simular la transmisión de cadenas mediante ceros y unos. Los números binarios se representan mediante listas de bits en orden inverso. Un bit es cero o uno. Por ejemplo, el número 1101 se representa por [1,0,1,1]. El tipo Bit es el de los bits. type Bit = Int 29 / 42
  • 30. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Codificación y descodificación 30 / 42
  • 31. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Cambio de bases: De binario a decimal (bin2int x) es el número decimal correspondiente al número binario x. Por ejemplo, bin2int [1,0,1,1] 13 El cálculo es bin2int [1,0,1,1] = bin2int 1:(0:(1:(1:[]))) = 1+2*(0+2*(1+2*(1+2*0))) = 13 bin2int :: [Bit] -> Int bin2int = foldr (x y -> x + 2*y) 0 31 / 42
  • 32. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Cambio de base: De decimal a binario (int2bin x) es el número binario correspondiente al número decimal x. Por ejemplo, int2bin 13 [1,0,1,1] int2bin :: Int -> [Bit] int2bin 0 = [] int2bin n = n `mod` 2 : int2bin (n `div` 2) Por ejemplo, int2bin 13 = 13 `mod` 2 : int2bin (13 `div` 2) = 1 : int2bin (6 `div` 2) = 1 : (6 `mod` 2 : int2bin (6 `div` 2)) = 1 : (0 : int2bin 3) = 1 : (0 : (3 `mod` 2 : int2bin (3 `div` 2))) = 1 : (0 : (1 : int2bin 1)) = 1 : (0 : (1 : (1 : int2bin 0))) = 1 : (0 : (1 : (1 : []))) = [1,0,1,1] 32 / 42
  • 33. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Cambio de base: Comprobación de propiedades Propiedad: Al pasar un número natural a binario con int2bin y el resultado a decimal con bin2int se obtiene el número inicial. prop_int_bin :: Int -> Bool prop_int_bin x = bin2int (int2bin y) == y where y = abs x Comprobación: *Main> quickCheck prop_int_bin +++ OK, passed 100 tests. 33 / 42
  • 34. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Tema 7: Funciones de orden superior 1. Funciones de orden superior 2. Procesamiento de listas 3. Función de plegado por la derecha: foldr 4. Función de plegado por la izquierda: foldl 5. Composición de funciones 6. Caso de estudio: Codificación binaria y transmisión de cadenas Cambio de bases Codificación y descodificación 34 / 42
  • 35. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Creación de octetos Un octeto es un grupo de ocho bits. (creaOcteto bs) es el octeto correspondiente a la lista de bits bs; es decir, los 8 primeros elementos de bs si su longitud es mayor o igual que 8 y la lista de 8 elemento añadiendo ceros al final de bs en caso contrario. Por ejemplo, Main*> creaOcteto [1,0,1,1,0,0,1,1,1,0,0,0] [1,0,1,1,0,0,1,1] Main*> creaOcteto [1,0,1,1] [1,0,1,1,0,0,0,0] creaOcteto :: [Bit] -> [Bit] creaOcteto bs = take 8 (bs ++ repeat 0) donde (repeat x) es una lista infinita cuyo único elemento es x. 35 / 42
  • 36. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Codificación (codifica c) es la codificación de la cadena c como una lista de bits obtenida convirtiendo cada carácter en un número Unicode, convirtiendo cada uno de dichos números en un octeto y concatenando los octetos para obtener una lista de bits. Por ejemplo, *Main> codifica "abc" [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,1,0,0,0,1,1,0] codifica :: String -> [Bit] codifica = concat . map (creaOcteto . int2bin . ord) donde (concat xss) es la lista obtenida concatenando la lista de listas xss. 36 / 42
  • 37. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Codificación Ejemplo de codificación, 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] 37 / 42
  • 38. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Separación de octetos (separaOctetos bs) es la lista obtenida separando la lista de bits bs en listas de 8 elementos. Por ejemplo, *Main> separaOctetos [1,0,0,0,0,1,1,0,0,1,0,0,0,1,1,0] [[1,0,0,0,0,1,1,0],[0,1,0,0,0,1,1,0]] separaOctetos :: [Bit] -> [[Bit]] separaOctetos [] = [] separaOctetos bs = take 8 bs : separaOctetos (drop 8 bs) 38 / 42
  • 39. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Descodificación (descodifica bs) es la cadena correspondiente a la lista de bits bs. Por ejemplo, *Main> 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] "abc" descodifica :: [Bit] -> String descodifica = map (chr . bin2int) . separaOctetos 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" 39 / 42
  • 40. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Transmisión Los canales de transmisión pueden representarse mediante funciones que transforman cadenas de bits en cadenas de bits. (transmite c t) es la cadena obtenida transmitiendo la cadena t a través del canal c. Por ejemplo, *Main> transmite id "Texto por canal correcto" "Texto por canal correcto" transmite :: ([Bit] -> [Bit]) -> String -> String transmite canal = descodifica . canal . codifica 40 / 42
  • 41. IM Tema 7: Funciones de orden superior Caso de estudio: Codificación binaria y transmisión de cadenas Codificación y descodificación Corrección de la transmisión Propiedad: Al trasmitir cualquier cadena por el canal identidad se obtiene la cadena. prop_transmite :: String -> Bool prop_transmite cs = transmite id cs == cs Comprobación de la corrección: *Main> quickCheck prop_transmite +++ OK, passed 100 tests. 41 / 42
  • 42. IM Tema 7: Funciones de orden superior Bibliografía Bibliografía 1. R. Bird. Introducción a la programación funcional con Haskell. Prentice Hall, 2000. Cap. 4: Listas. 2. G. Hutton Programming in Haskell. Cambridge University Press, 2007. Cap. 7: Higher-order functions. 3. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonando con Haskell. Thompson, 2004. Cap. 8: Funciones de orden superior y polimorfismo. 4. S. Thompson. Haskell: The Craft of Functional Programming, Second Edition. Addison-Wesley, 1999. Cap. 9: Generalization: patterns of computation. Cap. 10: Functions as values. 42 / 42