stringtranslate.com

Función pura

En programación de computadoras , una función pura es una función que tiene las siguientes propiedades: [1] [2]

  1. los valores de retorno de la función son idénticos para argumentos idénticos (sin variación con variables estáticas locales , variables no locales , argumentos de referencia mutables o flujos de entrada , es decir, transparencia referencial ), y
  2. la función no tiene efectos secundarios (sin mutación de variables estáticas locales, variables no locales, argumentos de referencia mutables o flujos de entrada/salida).

Ejemplos

Funciones puras

Los siguientes ejemplos de funciones de C++ son puros:

Funciones impuras

Las siguientes funciones de C++ son impuras ya que carecen de la propiedad 1 anterior:

Las siguientes funciones de C++ son impuras ya que carecen de la propiedad 2 anterior:

Las siguientes funciones de C++ son impuras ya que carecen de las propiedades 1 y 2 anteriores:

E/S en funciones puras

La E/S es inherentemente impura: las operaciones de entrada socavan la transparencia referencial y las operaciones de salida crean efectos secundarios. Sin embargo, en cierto sentido una función puede realizar entradas o salidas y seguir siendo pura, si la secuencia de operaciones en los dispositivos de E/S relevantes se modela explícitamente como argumento y resultado, y las operaciones de E/S se toman como argumento. falla cuando la secuencia de entrada no describe las operaciones realmente realizadas desde que el programa comenzó a ejecutarse. [ se necesita aclaración ]

El segundo punto garantiza que la única secuencia utilizable como argumento debe cambiar con cada acción de E/S; el primero permite que diferentes llamadas a una función de E/S devuelvan resultados diferentes debido a que los argumentos de la secuencia han cambiado. [3] [4]

La mónada de E/S es un lenguaje de programación que normalmente se utiliza para realizar E/S en lenguajes puramente funcionales.

Memorización

Los resultados de una función pura se pueden precalcular y almacenar en caché en una tabla de búsqueda. En una técnica llamada memorización , cualquier resultado devuelto por una función determinada se almacena en caché, y la próxima vez que se llama a la función con los mismos parámetros de entrada, se devuelve el resultado almacenado en caché en lugar de volver a calcular la función.

La memorización se puede realizar envolviendo la función en otra función ( función contenedora ). [5]

Mediante la memorización se puede reducir el esfuerzo computacional involucrado en los cálculos de la propia función, a costa de la sobrecarga de gestión de la caché y un aumento de los requisitos de memoria.

Un programa en C para el cálculo factorial en caché ( assert()aborta con un mensaje de error si su argumento es falso; en una máquina de 32 bits, los valores más allá fact(12)no se pueden representar de todos modos. [ cita necesaria ]

hecho int estático ( int n ) { retorno n <= 1 ? 1 : hecho ( n -1 ) * n ; } int fact_wrapper ( int n ) { caché int estática [ 13 ]; afirmar ( 0 <= n && n < 13 ); if ( caché [ n ] == 0 ) caché [ n ] = hecho ( n ); devolver caché [ n ]; }                             

Optimizaciones del compilador

Las funciones que tienen solo la propiedad 2 anterior (es decir, no tienen efectos secundarios) permiten técnicas de optimización del compilador, como la eliminación de subexpresiones comunes y la optimización de bucles similares a los operadores aritméticos. [6] Un ejemplo de C++ es el lengthmétodo que devuelve el tamaño de una cadena, que depende del contenido de la memoria al que apunta la cadena, por lo que carece de la propiedad 1 anterior. Sin embargo, en un entorno de subproceso único , el siguiente código C++

std :: string s = "¡Hola mundo!" ; int a [ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }; intl = 0 ;                  para ( int i = 0 ; i < 10 ; ++ i ) { l += s . longitud () + a [ i ]; }              

se puede optimizar de modo que el valor de s.length()se calcule solo una vez, antes del ciclo.

Algunos lenguajes de programación permiten declarar una propiedad pura a una función:

Examen de la unidad

Dado que las funciones puras tienen valores de retorno idénticos para argumentos idénticos , son muy adecuadas para pruebas unitarias .

Ver también

Referencias

  1. ^ Bartosz Milewski (2013). "Conceptos básicos de Haskell". Escuela de Haskell . FP completa. Archivado desde el original el 27 de octubre de 2016 . Consultado el 13 de julio de 2018 .
  2. ^ Brian Lonsdorf (2015). "Guía de programación funcional más adecuada del profesor Frisby". GitHub . Consultado el 20 de marzo de 2020 .
  3. ^ Peyton Jones, Simon L. (2003). Haskell 98 Idioma y bibliotecas: el informe revisado (PDF) . Cambridge, Reino Unido: Cambridge University Press. pag. 95.ISBN 0-521 826144. Consultado el 17 de julio de 2014 .
  4. ^ Hanus, Michael. "Curry: un lenguaje lógico funcional integrado" (PDF) . www-ps.informatik.uni-kiel.de . Institut für Informatik, Christian-Albrechts-Universität zu Kiel. pag. 33. Archivado desde el original (PDF) el 25 de julio de 2014 . Consultado el 17 de julio de 2014 .
  5. ^ Aley, R. (2017). Programación PHP funcional profesional: estrategias de desarrollo de aplicaciones para optimización del rendimiento, simultaneidad, capacidad de prueba y brevedad del código. SpringerEnlace: Bücher. Presione. pag. 109.ISBN 978-1-4842-2958-3. Consultado el 4 de febrero de 2024 .
  6. ^ "Atributos de funciones comunes: uso de la colección de compiladores GNU (GCC)". gcc.gnu.org, la colección de compiladores GNU . Fundación de Software Libre, Inc. Consultado el 28 de junio de 2018 .
  7. ^ Atributo puro en Fortran
  8. ^ Atributo puro en lenguaje D
  9. ^ "Atributos de funciones comunes". Usando la colección de compiladores GNU (GCC) . Consultado el 22 de julio de 2021 .
  10. ^ atributo constexpr en C++