Tema 1: Introducción a la programación funcional

1 Funciones

1.1 Funciones en Haskell

doble x = x + x
doble 3 
= 3 + 3   [def. de doble] 
= 6       [def. de +] 

1.2 Evaluaciones de funciones en Haskell

doble (doble 3)  
= doble (3 + 3)   [def. de doble]  
= doble 6         [def. de +]      
= 6 + 6           [def. de doble]  
= 12              [def. de +]
doble (doble 3) 
= (doble 3) + (doble 3)    [def. de doble] 
= (3 +3) + (doble 3)       [def. de doble] 
= 6 + (doble 3)            [def. de +] 
= 6 + (3 + 3)              [def. de doble] 
= 6 + 6                    [def. de +] 
= 12                       [def. de +]

1.3 Comprobación de propiedades

prop_doble x y = doble (x+y) == (doble x) + (doble y)  
ghci> quickCheck prop_doble
+++ OK, passed 100 tests.
import Test.QuickCheck

1.4 Refutación de propiedades

prop_prod_suma x y = x*y /= x+y
ghci> quickCheck prop_prod_suma
*** Failed! Falsifiable (after 1 test):
0
0
prop_prod_suma' x y = 
    x /= 0 && y /= 0 ==> x*y /= x+y
ghci> quickCheck prop_prod_suma'
+++ OK, passed 100 tests.
ghci> quickCheck prop_prod_suma'
*** Failed! Falsifiable (after 5 tests):  
2
2

2 Programación funcional

2.1 Programación funcional y programación imperativa

2.2 Solución mediante programación imperativa

def suma(n):
    contador = 0
    total    = 0 
    while contador < n:
        contador = contador + 1 
        total    = total + contador 
    return total
|contador | total |
|---------|-------|
|0        | 0     |
|1        | 1     |
|2        | 3     |
|3        | 6     |
|4        | 10    |

2.3 Solución mediante programación funcional

suma n = sum [1..n]
suma 4 
= sum [1..4]        [def. de suma] 
= sum [1, 2, 3, 4]  [def. de [..]] 
= 1 + 2 + 3 + 4     [def. de sum] 
= 10                [def. de +]

3 Rasgos característicos de Haskell

4 Antecedentes históricos

5 Presentación de Haskell

5.1 Ejemplo de recursión sobre listas

sum []     = 0
sum (x:xs) = x + sum xs
sum [2,3,7] 
= 2 + sum [3,7]           [def. de sum] 
= 2 + (3 + sum [7])       [def. de sum] 
= 2 + (3 + (7 + sum []))  [def. de sum] 
= 2 + (3 + (7 + 0))       [def. de sum] 
= 12                      [def. de +] 

5.2 Ejemplo con listas de comprensión

ordena [4,6,2,5,3] == [2,3,4,5,6]
ordena "deacb"     == "abcde"
ordena [] = []
ordena (x:xs) = 
    (ordena menores) ++ [x] ++ (ordena mayores)
    where menores = [a | a <- xs, a <= x]
          mayores = [b | b <- xs, b > x]

5.3 Evaluación del ejemplo con listas de comprensión

ordena [4,6,2,3] 
= (ordena [2,3]) ++ [4] ++ (ordena [6])  
  [def. ordena] 
= ((ordena []) ++ [2] ++ (ordena [3])) ++ [4] ++ (ordena [6]) 
  [def. ordena] 
= ([] ++ [2] ++ (ordena [3])) ++ [4] ++ (ordena [6]) 
  [def. ordena] 
= ([2] ++ (ordena [3])) ++ [4] ++ (ordena [6,5]) 
  [def. ++] 
= ([2] ++ ((ordena []) ++ [3] ++ [])) ++ [4] ++ (ordena [6]) 
  [def. ordena] 
= ([2] ++ ([] ++ [3] ++ [])) ++ [4] ++ (ordena [6]) 
  [def. ordena] 
= ([2] ++ [3]) ++ [4] ++ (ordena [6]) 
  [def. ++] 
= [2,3] ++ [4] ++ (ordena [6]) 
  [def. ++] 
= [2,3,4] ++ (ordena [6]) 
  [def. ++] 
= [2,3,4] ++ ((ordena []) ++ [6] ++ (ordena [])) 
  [def. ordena] 
= [2,3,4] ++ ((ordena []) ++ [6] ++ (ordena [])) 
  [def. ordena] 
= [2,3,4] ++ ([] ++ [6] ++ []) 
  [def. ordena] 
= [2,3,4,6]
  [def. ++]

6 Bibliografía



Universidad de Sevilla

José A. Alonso Jiménez
Grupo de Lógica Computacional
Dpto. de Ciencias de la Computación e I.A.
Universidad de Sevilla