stringtranslate.com

Programación puramente funcional

En informática , la programación puramente funcional suele designar un paradigma de programación —un estilo de construir la estructura y los elementos de los programas informáticos— que trata todo cálculo 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 la ejecución del programa: se pasa una variable de estado como parámetro de entrada de una función de transformación de estado, que devuelve el estado actualizado como parte de su valor de retorno. Este estilo maneja los cambios de estado sin perder la transparencia referencial de las expresiones del programa.

La programación puramente funcional consiste en asegurar que las funciones, dentro del paradigma funcional , sólo dependerán de sus argumentos, independientemente de cualquier estado global o local. Una subrutina puramente funcional sólo 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 un tema 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 cometen errores o divergen. [1]

Generalmente se dice que un programa es funcional cuando utiliza algunos conceptos de programación funcional , como funciones de primera clase y funciones de orden superior . [2] Sin embargo, una función de primera clase no necesita ser puramente funcional, ya que puede utilizar técnicas del paradigma imperativo , como matrices 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 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 en qué orden se evalúan los programas, ya que la evaluación ansiosa devolverá el mismo resultado que la evaluación perezosa . Sin embargo, todavía es posible que una evaluación ansiosa no termine mientras que la evaluación perezosa del mismo programa se detiene. Una ventaja de esto es que la evaluación perezosa se puede implementar mucho más fácilmente; 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 los 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 manejar 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 bloqueos, pero tiene 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 la creación de perfiles en tiempo de ejecución y el análisis en tiempo de compilación para juzgar si la introducción del 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 completamente automática no es práctica. [5]

Estructuras de datos

Las estructuras de datos puramente funcionales son persistentes . La persistencia es necesaria 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 no puramente funcionales persistentes , mientras que esas estructuras de datos pueden no utilizarse en programas puramente funcionales.

Las estructuras de datos puramente funcionales suelen representarse de una manera diferente a sus contrapartes imperativas . [6] Por ejemplo, una matriz 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 matrices. Las matrices se pueden reemplazar 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 se pueden usar en lenguajes que no son 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 que antes eran mutables ahora sean devueltas 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 un lenguaje que solo admite programación puramente funcional. Sin embargo, se pueden escribir programas puramente funcionales en lenguajes que no sean 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), Models of My Life pp.189-190 ISBN 0-465-04640-1 afirman que él, Al Newell y Cliff Shaw son "comúnmente considerados los padres del [campo] de la inteligencia artificial", por escribir Logic Theorist , un programa que demostraba automáticamente teoremas de Principia Mathematica . Para lograrlo, tuvieron que inventar un lenguaje y un paradigma que, visto retrospectivamente, incorpora la programación funcional. 
  4. ^ McCarthy, John (junio de 1978). "Historia de Lisp". En ACM SIGPLAN History of Programming Languages ​​Conference : 217–223. doi :10.1145/800025.808387.
  5. ^ ab 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