Programación funcional

De EcuRed
Programación funcional
Información sobre la plantilla
Concepto:La programación Funcional es un tipo de paradigmas de programación En el paradigma de la programación funcional, un programa se considera una función matemática, la cual describe una relación entre una entrada y una salida y donde el concepto de estado o variable se elimina completamente..

Programación funcional. se basa en el concepto de función (que no es más que una evolución de los predicados), de corte más matemático.

Contenido

Características de la programación funcional

Históricamente, los ordenadores se han programado utilizando lenguajes muy cercanos a las peculiaridades de la propia máquina: operaciones aritméticas simples, instrucciones de acceso a memoria, etc. Un programa escrito de esta manera puede ocultar totalmente su propósito a la comprensión de un ser humano, incluso uno entrenado. Hoy día, estos lenguajes pertenecientes al paradigma de la Programación Imperativa han evolucionado de manera que ya no son tan crípticos.

En el paradigma de la programación funcional, un programa se considera una función matemática, la cual describe una relación entre una entrada y una salida y donde el concepto de estado o variable se elimina completamente. Sabemos que una función matemática es una regla que asocia a cada x de un conjunto X de valores, un único y de otro conjunto Y de valores; se representa por: f:X → Y ó por y = f(x) Si ignoramos cómo un programa computa sus datos y nos fijamos sólo en qué computa, podemos ver al mismo como una función matemática que dada una entrada, devuelve una salida; se representa por Programa : Input -> Output ó output = Programa(input). De aquí que la implementación de un lenguaje que permita crear programas con el enfoque de una función matemática, debía ser basado en el recurso función de los lenguajes de programación.. Ahora bien, entre la concepción de una función matemática y la de una función en los lenguajes de programación tradicionales, existían diferencias:

  • Lenguajes de programación: Hay distinción entre la definición de la función (descripción de lo que va a hacer la función mediante los parámetros formales) y la aplicación de la misma (llamada con los parámetros actuales). Las variables refieren una zona de memoria donde se almacena un valor
  • Matemáticas: La distinción no es clara, a menudo el término " variable independiente " se usa tanto para el parámetro formal como actual.

Ejemplo: Si se tiene la expresión "Sea x tal que f(x) = 2 “ , no se distingue con claridad si se refiere a la definición de la función constante de valor 2 o al punto x específico en el que una función f ya definida toma el valor 2. Las variables siempre se refieren a un valor y no a una localización de memoria. No hay concepto de localización de memoria y por tanto la expr. x=x+1 no tiene sentido.

La programación funcional debe por esto eliminar el concepto de variable excepto como nombre de un valor. Por lo anterior, se concibió que en la Programación Funcional la asignación no fuera permitida como instrucción.

En programación funcional pura no existen variables, sólo existen constantes, parámetros y valores, aún cuando en la práctica la mayoría de los lenguajes de programación funcionales no son puros pues retienen algunas nociones de variables y asignaciones. Como no hay variables ni asignación, tampoco existen los ciclos al estilo de los de los lenguajes tradicionales ya que los mismos trabajan con una variable de control que se va reasignando (decrementando o incrementando). Esto se logra en un lenguaje funcional mediante la recursión.


Si lo programamos funcionalmente en un lenguaje procedural como ADA, quedaría como sigue :

procedure MCD(u,v:integer):integer;
begin
 if (v=0) then return u
else
 return MCD(v,u mod v);
end; {MCD}

Consecuencias de ausencia de variables y asignación

Otra consecuencia de la ausencia de variables y de asignación es el hecho de que el valor de cualquier función depende solamente de los valores de sus parámetros y no de llamados previos a otras o a la misma función, así como que el valor de cualquier función no depende del orden de evaluación de sus parámetros, lo cual se conoce por el nombre de transparencia referencial, lo que facilita el empleo de la programación funcional se utiliza en aplicaciones concurrentes. El hecho de que en los lenguajes funcionales no existen las variables y existe la transparencia referencial, hacen la semántica de los programas funcionales particularmente conveniente:

  • No existe estado, ya que no existe concepto de localización de memoria ni de variable.
  • El ambiente de ejecución asocia valores con nombres, no con localizaciones de memoria; una vez que un nombre entra al ambiente, su valor no cambia. Es por esto que se habla en este caso de semántica de valores, para distinguir este tipo de semántica de la usual (semántica de almacenamiento o semántica de apuntadores).
  • En la programación funcional, debemos estar listos para manipular funciones sin restricciones arbitrarias. En particular, las funciones deben ser vistas como valores en sí ellas, las cuales pueden ser ejecutadas por otras funciones y las cuales pueden ser también parámetros de otras funciones, esto se expresa diciendo que estas funciones son valores de primera clase.

Características

Las características más generales de la programación funcional se resumen en:

  • Ausencia de efectos colaterales
  • El valor de una expresión solo depende de los valores de sus subexpresiones, si las tiene.

Se dice que una función (f x y z) tiene un efecto colateral si los valores de x, y, y/o z cambian en el entorno de llamada durante la aplicación de la función a sus argumentos, o si alguna otra acción ocurre mientras se evalúa f.

Una función definida con todos los parámetros por valor y donde no se hacen asignaciones a las variables globales, no tiene efectos colaterales.

La mayoría de las implementaciones de LISP incorporan algunos efectos colaterales y tipos de datos integrados. Éstos han sido incluidos para hacer más sencillo un código fácilmente legible y las implementaciones eficientes.

Semántica limpia

Algunas de las características que hacen que un lenguaje sea útil y confiable son en las cuales el lenguaje significa lo que dice -no es ambiguo- y los resultados de un programa pueden verificarse. En un lenguaje funcional f(3) siempre devolverá el mismo resultado, mientras que en un lenguaje imperativo, como Pascal, éste puede no ser el caso.

  • El manejo del almacenamiento de los datos es implícito, ciertas operaciones asignan almacenamiento en el momento necesario y cuando se vuelve inaccesible o no referenciado se libera automáticamente, con uso de recolección de basuras, código de programa más simple y corto.
  • Las funciones son valores de primera clase. Eso significa que las funciones tienen la misma jerarquía que cualquier otro valor. Una función puede ser el valor de una expresión, puede pasarse como argumento y puede colocarse en una estructura de datos.

Cuestiones finales

El estilo de la programación funcional puede ser usado y lo está siendo cada vez más en lenguajes imperativos (Ejemplo: PASCAL) por las mismas razones por las cuales el uso de los lenguajes funcionales se ha incrementado: la simplicidad de la semántica y la resultante claridad de los programas. El requerimiento básico para programar funcionalmente en cualquier lenguaje es que el mismo permita la recursión así como un mecanismo de funciones general y adecuado.

Un problema típico en este estilo de programación es el costo de ejecución de los ciclos mediante la recursión. Incluso con los procesadores modernos, que reducen sustancialmente la sobrecarga de la llamada a procedimiento, las implementaciones recursivas son más lentas que las que usan los ciclos standard.

Véase también

Enlaces externos