stringtranslate.com

Función pura

En programación informática , 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 porque carecen de la propiedad 1 mencionada anteriormente:

Las siguientes funciones de C++ son impuras porque carecen de la propiedad 2 mencionada anteriormente:

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

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, hay un sentido en el que una función puede realizar operaciones de entrada o salida y aún así ser pura, si la secuencia de operaciones en los dispositivos de E/S relevantes se modela explícitamente como argumento y como resultado, y se considera que las operaciones de E/S fallan cuando la secuencia de entrada no describe las operaciones realmente realizadas desde que el programa comenzó a ejecutarse. [ aclaración necesaria ]

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 que realiza E/S devuelvan resultados diferentes debido a que los argumentos de la secuencia han cambiado. [3] [4]

La mónada E/S es un modismo 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 calcular previamente y almacenar en caché en una tabla de búsqueda. En una técnica llamada memorización , cualquier resultado que se devuelva de una función determinada se almacena en caché y la próxima vez que se llame 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 envolvente ). [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 de un aumento de los requerimientos de memoria.

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

static int fact ( int n ) { return n <= 1 ? 1 : fact ( n -1 ) * n ; } int fact_wrapper ( int n ) { static int caché [ 13 ]; assert ( 0 <= n && n < 13 ); if ( caché [ n ] == 0 ) caché [ n ] = fact ( n ); return 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 , de manera similar 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 a la que apunta la cadena, por lo que carece de la propiedad 1 anterior. Sin embargo, en un entorno de un solo subproceso , el siguiente código C++

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

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

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

Pruebas unitarias

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

Véase también

Referencias

  1. Bartosz Milewski (2013). «Fundamentos de Haskell». Escuela de Haskell . FP Complete. Archivado desde el original el 27 de octubre de 2016. Consultado el 13 de julio de 2018 .
  2. ^ Brian Lonsdorf (2015). "Guía bastante adecuada para la programación funcional del profesor Frisby". GitHub . Consultado el 20 de marzo de 2020 .
  3. ^ Peyton Jones, Simon L. (2003). Haskell 98 Language and Libraries: The Revised Report (PDF) . Cambridge, Reino Unido: Cambridge University Press. pág. 95. ISBN. 0-521 826144. Recuperado 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 optimizar el rendimiento, la concurrencia, la capacidad de prueba y la brevedad del código. SpringerLink : Bücher. Apress. p. 109. ISBN 978-1-4842-2958-3. Recuperado 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 . Free Software Foundation, Inc. Consultado el 28 de junio de 2018 .
  7. ^ Atributo puro en Fortran
  8. ^ Atributo puro en lenguaje D
  9. ^ "Atributos de funciones comunes". Uso de la colección de compiladores GNU (GCC . Consultado el 22 de julio de 2021 .
  10. ^ atributo constexpr en C++