Busqueda...

Programación Funcional


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:
  1. definir funciones
  2. componer funciones
  3. evaluar funciones
Las ejecuciones no son como en lenguajes procedimentales, se basan en un concepto particular.
El intérprete sigue los siguientes pasos:
  1. Evaluar las subexpresiones (expresiones que están a la derecha de la función)
  2. 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

1 comentario: