El paradigma funcional (2)

Table of Contents

Bibliografía

Índice del tema

  • Historia del paradigma funcional
  • Características del paradigma funcional puro
  • Modelo de computación basado en sustitución
  • Características de la programación funcional (LISP, Scheme)

La programación funcional

  • Entendemos por programación funcional las características del LISP y de los lenguajes funcionales menos puros que derivan de él (Scheme)
  • Tiene características que van más allá del paradigma de programación funcional puro / declarativo que vimos ayer
  • Algunas de ellas:
    • Funciones como tipos de datos primitivos y funciones de orden superior
    • Polimorfismo
    • Símbolos y dualidad entre datos y código

Funciones como tipos de datos primitivos

Las funciones son tipos primitivos de los lenguajes funcionales.

Un tipo primitivo es aquel que:

  • Puede ser asignado a una variable
  • Puede ser pasado como argumento a una función
  • Puede ser devuelto como resultado de una invocación a una función
  • Puede ser parte de un tipo mayor

Forma especial lambda

  • La forma especial lambda es la forma en Scheme de construir funciones sin darles un nombre.
  • Igual que al escribir "hola" se crea una cadena (que antes no existía), al llamar a lambda se crea una función en tiempo de ejecución.
  • Ejemplo
    (lambda (x) (* x x))
    
  • Sintaxis:
    (lambda (<arg1> ... <argn>) <cuerpo>)
    

Con una función creada podemos

  • Invocarla:
    ((lambda (x) (* x x)) 3)
    
  • Darle un nombre:
    (define cuadrado (lambda (x) (* x x)))
    

Una función puede ser el argumento de otra función

(define (aplica f x y)
   (f x y))
(aplica + 2 3)
(aplica * 4 5)
(aplica string-append "hola" "adios")
(aplica (lambda (x y) (sqrt (+ (* x x) (* y y)))) 3 4)
  • Otro ejemplo:
    (define (aplica-2 f g x)
       (f (g x)))
    (define (suma-5 x)
        (+ x 5))
    (define (doble x)
        (+ x x))
    
    (aplica-2 suma-5 doble 3)
    

Una función puede ser el valor devuelto por otra

(define (hacer-sumador-k k)
   (lambda (x)
      (+ x k)))
(define g (hacer-sumador-k 5))
(g 10)

Funciones de orden superior

  • Llamamos funciones de orden superior (higher order functions en inglés) a las funciones que toman otras como parámetro o devuelven otra función
  • La función map de Scheme es un ejemplo
    (map cuadrado '(1 2 3 4 5))
    (map * '(1 2 3) '(4 5 6))
    
  • Otro ejemplo: operar
    (define (operar f base lista)
        (if (null? lista)
            base
            (f (car lista) 
               (operar f base (cdr lista)))))
    

Las funciones pueden formar parte de otras estructuras de datos

  • Por ejemplo, una lista de funciones
  • Veamos un ejemplo de cómo usarlo en aplica-funcs
    (define (aplica-funcs lista-funcs x)
        (if (null? (cdr lista-funcs))
            ((car lista-funcs) x)
            ((car lista-funcs)
                 (aplica-funcs (cdr lista-funcs) x))))
    
    (define lista-funcs (list doble suma-5 cuadrado))
    
    (aplica-funcs lista-funcs 10)
    

Dualidad entre datos y programas

  • Los programas en Scheme son expresiones entre paréntesis
  • Una expresión es una lista de símbolos
  • Esto permite tratar a los programas como datos y viceversa
  • Un ejemplo: sumpongamos que queremos sumar una lista de números
    (define (suma-lista lista-nums)
       (eval (cons '+ lista-nums)))
    

Lenguajes y Paradigmas de Programación
Curso 2010-2011
Departamento de Ciencia de la Computación e Inteligencia Artificial
Universidad de Alicante

Sitio web realizado con org-mode y el estilo CSS del proyecto Worg
Validate XHTML 1.0