Articulo de referencia

Programación puramente funcional

En informática , la programación puramente funcional suele designar un paradigma de programación —un estilo de construcción de la estructura y los elementos de los programas inf...

En informática , la programación puramente funcional suele designar un paradigma de programación —un estilo de construcción de la estructura y los elementos de los programas informáticos— que trata todos los cálculos como la evaluación de funciones matemáticas .

El estado del programa y los objetos mutables suelen modelarse con lógica temporal , como variables explícitas que representan el estado del programa en cada paso de su ejecución: el estado de la variable se pasa como parámetro de entrada a una función de transformación de estado, que devuelve el estado actualizado como parte de su valor de retorno. Este estilo gestiona los cambios de estado sin perder la transparencia referencial de las expresiones del programa.

La programación puramente funcional consiste en garantizar que las funciones, dentro del paradigma funcional , dependan únicamente de sus argumentos, independientemente de cualquier estado global o local. Una subrutina puramente funcional solo tiene visibilidad de los cambios de estado representados por las variables de estado incluidas en su ámbito.

Diferencia entre programación funcional pura e impura

La diferencia exacta entre programación funcional pura e impura es objeto de controversia. La definición de pureza propuesta por Sabry es que todas las estrategias de evaluación comunes (llamada por nombre, llamada por valor y llamada por necesidad) producen el mismo resultado, ignorando las estrategias que generan errores o divergen. [ 1 ]

Se suele decir que un programa es funcional cuando utiliza algunos conceptos de la programación funcional , como funciones de primera clase y funciones de orden superior . [ 2 ] Sin embargo, una función de primera clase no tiene por qué ser puramente funcional, ya que puede utilizar técnicas del paradigma imperativo , como arreglos o métodos de entrada/salida que utilizan celdas mutables, que actualizan su estado como efectos secundarios. De hecho, los primeros lenguajes de programación citados como funcionales, IPL y Lisp , [ 3 ] [ 4 ] son ​​ambos lenguajes funcionales "impuros" según la definición de Sabry.

Propiedades de la programación puramente funcional

Evaluación estricta versus evaluación no estricta

Cada estrategia de evaluación que finaliza en un programa puramente funcional devuelve el mismo resultado. En particular, garantiza que el programador no tenga que considerar el orden de evaluación, ya que la evaluación inmediata devolverá el mismo resultado que la evaluación diferida . Sin embargo, aún es posible que una evaluación inmediata no finalice mientras que la evaluación diferida del mismo programa se detiene. Una ventaja de esto es que la evaluación diferida se puede implementar con mucha más facilidad; como todas las expresiones devolverán el mismo resultado en cualquier momento (independientemente del estado del programa), su evaluación se puede retrasar tanto como sea necesario.

Computación paralela

En un lenguaje puramente funcional, las únicas dependencias entre cálculos son las dependencias de datos, y los cálculos son deterministas. Por lo tanto, para programar en paralelo, el programador solo necesita especificar las partes que deben calcularse en paralelo, y el entorno de ejecución puede encargarse de todos los demás detalles, como la distribución de tareas a los procesadores, la gestión de la sincronización y la comunicación, y la recolección de basura en paralelo. Este estilo de programación evita problemas comunes como las condiciones de carrera y los interbloqueos, pero ofrece menos control que un lenguaje imperativo. [ 5 ]

Para garantizar una aceleración, la granularidad de las tareas debe elegirse cuidadosamente para que no sea ni demasiado grande ni demasiado pequeña. En teoría, es posible utilizar el análisis de rendimiento en tiempo de ejecución y el análisis en tiempo de compilación para determinar si la introducción de paralelismo acelerará el programa y, por lo tanto, paralelizar automáticamente los programas puramente funcionales. En la práctica, esto no ha tenido mucho éxito y la paralelización totalmente automática no es práctica. [ 5 ]

Estructuras de datos

Las estructuras de datos puramente funcionales son persistentes . La persistencia es esencial para la programación funcional; sin ella, el mismo cálculo podría arrojar resultados diferentes. La programación funcional puede utilizar estructuras de datos persistentes que no son puramente funcionales , mientras que estas estructuras no se utilizan en programas puramente funcionales.

Las estructuras de datos puramente funcionales suelen representarse de forma diferente a sus contrapartes imperativas . [ 6 ] Por ejemplo, un array con acceso y actualización en tiempo constante es un componente básico de la mayoría de los lenguajes imperativos, y muchas estructuras de datos imperativas, como la tabla hash y el montón binario , se basan en arrays. Los arrays pueden reemplazarse por mapas o listas de acceso aleatorio , que admiten una implementación puramente funcional, pero el tiempo de acceso y actualización es logarítmico . Por lo tanto, las estructuras de datos puramente funcionales pueden utilizarse en lenguajes no funcionales, pero pueden no ser la herramienta más eficiente disponible, especialmente si no se requiere persistencia.

En general, la conversión de un programa imperativo a uno puramente funcional también requiere asegurar que las estructuras anteriormente mutables ahora se devuelvan explícitamente desde las funciones que las actualizan, una estructura de programa llamada estilo de paso de almacenamiento .

Lenguaje puramente funcional

Un lenguaje puramente funcional es aquel que solo admite programación puramente funcional. Sin embargo, los programas puramente funcionales pueden escribirse en lenguajes que no son puramente funcionales.

Referencias

  1. Sabry, Amr (enero de 1993). "¿Qué es un lenguaje puramente funcional?". Journal of Functional Programming . 8 (1): 1– 22. CiteSeerX 10.1.1.27.7800 . doi : 10.1017/S0956796897002943 . S2CID 30595712 .  
  2. Atencio, Luis (18 de junio de 2016). Programación Funcional en Javascript . Publicaciones de Manning. ISBN 978-1617292828.
  3. Las memorias de Herbert A. Simon (1991), Modelos de mi vida, págs. 189-190 ISBN 0-465-04640-1Afirma que él, Al Newell y Cliff Shaw son considerados comúnmente los padres de la inteligencia artificial por haber escrito Logic Theorist , un programa que demostraba automáticamente teoremas de Principia Mathematica . Para lograrlo, tuvieron que inventar un lenguaje y un paradigma que, en retrospectiva, incorpora la programación funcional.
  4. McCarthy, John (junio de 1978). "Historia de LISP" . La primera conferencia ACM SIGPLAN sobre la historia de los lenguajes de programación - HOPL-1 . págs. 217–223 . doi : 10.1145/800025.808387 . 
  5. 1 2 Marlow, Simon (18 de junio de 2013). Programación paralela y concurrente en Haskell: Técnicas para programación multinúcleo y multihilo . O'Reilly Media. págs. 5–6 . ISBN  978-1449335946.
  6. Estructuras de datos puramente funcionales por Chris Okasaki , Cambridge University Press , 1998, ISBN 0-521-66350-4