El paradigma funcional (2)
Table of Contents
- Bibliografía
- Índice del tema
- La programación funcional
- Funciones como tipos de datos primitivos
- Forma especial lambda
- Con una función creada podemos
- Una función puede ser el argumento de otra función
- Una función puede ser el valor devuelto por otra
- Funciones de orden superior
- Las funciones pueden formar parte de otras estructuras de datos
- Dualidad entre datos y programas
Bibliografía
- Capítulo 1.1.5 SICP: The Substitution Model for Procedure Application
- Capítulo 10 PLP: Functional Languages
Í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
lambdaes 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
lambdase 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
mapde 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