Programación Funcional
En ciencias de la computación, la programación funcional es un paradigma de programación declarativa
basado en la utilización de funciones aritméticas que no maneja datos
mutables o de estado. Enfatiza la aplicación de funciones, en contraste con el
estilo de programación imperativa, que enfatiza los
cambios de estado. La programación funcional tiene sus raíces en el cálculo
lambda, un sistema formal desarrollado en los 1930s para investigar
la definición de función, la aplicación de las funciones y la recursión. Muchos
lenguajes de programación funcionales pueden ser vistos como elaboraciones del
cálculo lambda.
En la práctica, la diferencia
entre una función matemática y la noción de una "función" utilizada
en la programación imperativa es que las funciones imperativas pueden tener
efectos secundarios, al cambiar el valor de cálculos realizados previamente.
Por esta razón carecen de transparencia referencial, es decir, la misma
expresión lingüística puede resultar en valores diferentes en diferentes
momentos dependiendo del estado del programa siendo ejecutado. Con código
funcional, en contraste, el valor generado por una función depende
exclusivamente de los argumentos alimentados a la función. Al eliminar los
efectos secundarios se puede entender y predecir el comportamiento de un
programa mucho más fácilmente, y esta es una de las principales motivaciones
para utilizar la programación funcional.
Los lenguajes de programación
funcional, especialmente los que son puramente funcionales, han sido
enfatizados en el ambiente académico principalmente y no tanto en el desarrollo
de software comercial. Sin embargo, lenguajes de programación importantes tales
como Scheme, Erlang, Objective Caml y Haskel, han sido utilizados en
aplicaciones comerciales e industriales por muchas organizaciones. La
programación funcional también es utilizada en la industria a través de
lenguajes de dominio específico como R (estadística), Mathematica (matemáticas
simbólicas), J y K (análisis financiero), F# en Microsoft.NET y XSLT (XML).
Lenguajes de uso específico usados comúnmente como SQL y Lex/Yacc, utilizan
algunos elementos de programación funcional, especialmente al procesar valores
mutables. Las hojas de cálculo también pueden ser consideradas lenguajes de
programación funcional.
La programación funcional
también puede ser desarrollada en lenguajes que no están diseñados
específicamente para la programación funcional. En el caso de Perl, por ejemplo, que es
un lenguaje de programación imperativo, existe un libro que describe como
aplicar conceptos de programación funcional. JavaScript,
uno de los lenguajes más ampliamente utilizados en la actualidad, también
incorpora capacidades de programación funcional.
Características
Los programas escritos en un
lenguaje funcional están constituidos únicamente por definiciones de funciones,
entendiendo éstas no como subprogramas clásicos de un lenguaje imperativo, sino
como funciones puramente matemáticas, en las que se verifican ciertas
propiedades como la transparencia referencial (el
significado de una expresión depende únicamente del significado de sus
subexpresiones), y por tanto, la carencia total de efectos colaterales.
Otras características propias
de estos lenguajes son la no existencia de asignaciones de variables y la falta
de construcciones estructuradas como la secuencia o la iteración (lo que obliga
en la práctica a que todas las repeticiones de instrucciones se lleven a cabo
por medio de funciones recursivas).
Existen dos grandes
categorías de lenguajes funcionales: los funcionales puros y los híbridos.
La diferencia entre ambos estriba en que los lenguajes funcionales híbridos son
menos dogmáticos que los puros, al admitir conceptos tomados de los lenguajes imperativos, como las secuencias
de instrucciones o la asignación de variables. En contraste, los lenguajes
funcionales puros tienen una mayor potencia expresiva, conservando a la vez su
transparencia referencial, algo que no se cumple siempre con un lenguaje
funcional híbrido.
Notas adicionales
Todo se representa en el paradigma
funcional como expresiones, números son expresiones y operandos son
expresiones, etc.
El conjunto de operadores y
operandos representan una combinación.
El paréntesis representa la
aplicación funcional, esto hace que la agrupación básica por paréntesis deba
tratarse de forma cuidadosa, para evitar tener errores sintácticos.
Un programa en el paradigma
funcional se basa en:
- definir funciones
- componer funciones
- evaluar funciones
Las ejecuciones no son como en
lenguajes procedimentales, se basan en un concepto particular.
El intérprete sigue los siguientes
pasos:
- Evaluar las subexpresiones (expresiones que están a la derecha de la función)
- Aplicar la función que es el valor que se encuentra más a la izquierda en la combinación (operador) a los argumentos que se encuentran a su derecha (operandos)
Ejemplo:
(+ 1 2 3 4 5) -----> 15
(ValorAbsoluto -100) -------->
100
La notación es prefija por defecto
para la construcción de combinaciones.
El orden de evaluación es
aplicativo, es decir se evalúan argumentos antes que las funciones.
La Programación Funcional define la
salida de un programa como una función de sus entradas, excluyendo la noción de
estado y efecto de borde.
Funciones que retornan valores
estructurados: en lenguajes funcionales es posible retornar funciones con
valores no primitivos , es decir, arreglos, listas, etc.
Polimorfismo dinámico (Scheme) o
estático (Haskell): En el caso de scheme usa polimorfismo dinámico o
paramétrico que quiere decir que un procedimiento puede tener parámetros con
tipos no especificados, y al usarse con un tipo determinado se crean las
asociaciones correctas. Esto gracias a que Scheme usa manejo dinámico de tipos.
En el caso de haskell usa polimorfismo estático como en lenguaje c, donde se
debe especificar el tipo de cada parámetro.
Tipo Lista con abundantes
operadores.
Recursión: La recursión se da de
forma natural en lenguajes funcionales.
Tipos agregados definibles por el
usuario: se hacen mediante la aplicación del “define”, otorgándole nombre a las
combinaciones que definen el tipo
Recolección de basura: las
asociaciones se destruyen automáticamente luego que su tiempo de vida expira.
La asociación es estática para
nombres.
Constructores de asociación: definen
bloques que contienen asociaciones dentro. Son let, let* y letrec.
Lista de asociaciones paralelas
(let): los valores iníciales son computados antes de que cualquier variable sea
atada a una asociación.
Lista de asociaciones ordenadas
(let*): las asociaciones y evaluaciones son realizadas en orden secuencial.
Lista de asociaciones recursivas
(letrec): todas las asociaciones están en efecto mientras sus valores iníciales
son computados.
Listas heterogéneas.
Funciones para descomposición (car,
cdr y sus
extensiones).
Funciones para composición (cons,
append y list)
Predicados (null? para vacuidad).
Listas de Asociación (assq para
búsqueda).
Predicados para comparación: se
refiere a que cada comparación hecha por ejemplo por condicionales se trata
como un predicado, que puede tener asociado un valor verdadero o falso.
Booleanos (#t y #f): verdadero o
falso respectivamente.
Comparación:
¿Son el mismo objeto? (eq?).
¿Son semánticamente equivalentes?
(eqv?).
¿Son estructuralmente equivalentes?
(equal?).
Estas son estructuras que puedes
usar que retornan el valor de los predicados, es decir verdadero o falso.
Selección Simple (if).
Selección Generalizada (cond).
Las estructuras de control en la
programación funcional son las condiciones y la recursión.
Se pueden definir funciones de orden
superior, que son funciones que reciben funciones como parámetros o devuelven
funciones. Emplean de igual modo funciones de primer orden.
Ejemplos Programados (En Mit-Scheme)
;Iteracion simulada:
(define x 0)
(do ((i 1 (+ i 1))) ; i = 1, i = i+1
((> i 10) i)
;condicion de parada que se interpreta como: cuando i sea mayor que 10
(set! x (*
i 10)) ;procedimientos normales
(display
" ") ;procedimientos normales
(display x)
;procedimientos normales
)
;condiciones multiples:
(cond ((> 3 2) 'greater)
((< 3 2) 'less)
()
()
)
;Funciones de orden superior
(define funcion (lambda(a b) (a b)))
;es definir una función pero pasándole como argumento una función.
Recordar que la definición dice
;que funciones de orden superior reciben parámetros que son
funciones o retornan funciones.
;para definirla se defina una función lambda y se le da una asociación,
de definen los parámetros de forma normal
;pero en el cuerpo se ve reflejada la aplicación funcional
(recordar que cuando se evalúa una expresión al elemento mas
;a la izquierda se le toma como función y a los que están a
su derecha parámetros, por ende hacer (a b) es equivalente a
;tomar la función a y aplicarla al parámetro b
Yo Quiero saber que es un algoritmo funcional
ResponderEliminarPor favor