Today () es una función impura porque su resultado depende de algo que no le das; específicamente, la hora actual del sistema. Por lo tanto, su resultado no es determinista cuando se basa solo en las entradas proporcionadas en la invocación.
Una función pura sería int Add(int a, int b) {return a + b;}
. La función funciona únicamente con lo que se proporciona y no utiliza otros datos de estado externos. El resultado natural de esto es que puedes Add(2,2)
obtener 4 desde ahora hasta el final de los tiempos. Además, debido a que la función no cambia ningún estado externo (no tiene "efectos secundarios"), Agregar () ing 2 y 2 desde ahora hasta el final de los tiempos no cambiará nada más en el sistema, a menos que luego asigne el resultado de la función a una variable o use el valor para actualizar el estado (que no es una operación realizada por la función en sí). Prácticamente todas las operaciones matemáticas clásicas son funciones puras y pueden implementarse como tales.
Hoy (), por otro lado, puede producir el mismo valor cuando se llama dos veces seguidas, pero no si se llama repetidamente durante varios días. Esto se debe a que depende de datos de estado externos que usted no proporciona como parámetro para la función. Como resultado, es imposible, dentro de los límites del programa, controlar el resultado de la función Today (). Producirá un valor dado en un día determinado, y nunca producirá ese valor en ningún otro día, a menos que cambie el reloj del sistema de la computadora en la que se ejecuta (un cambio que generalmente ocurre fuera de los límites del programa).
Una función impura no es necesariamente algo malo; Se requieren funciones impuras, incluso en lenguajes funcionales, para interactuar con cualquier cosa fuera de los límites del programa, como almacenes de datos, canales de comunicación, pantallas de interfaz de usuario, dispositivos periféricos, etc. Un programa que no hace ninguna de estas cosas es un programa eso es muy limitado en su utilidad; Incluso iría tan lejos como para llamar trivial a un programa de este tipo, ya que sin ningún medio para aceptar la entrada o cualquier vía para informarle sobre su salida, bien podría no estar haciendo nada. Los programas escritos en lenguajes funcionales solo pueden tener la entrada proporcionada por el tiempo de ejecución y producir una salida informada al tiempo de ejecución sin ningún método impuro definido explícitamente, pero eso se debe a que el tiempo de ejecución está abstrayendo todos estos detalles impuros de trabajar dentro de un sistema informático imperfecto,
Es simplemente una cosa muy buena saber cuáles de las funciones que está utilizando son puras y cuáles no, para que pueda tomar buenas decisiones sobre cómo se utilizan. Las funciones impuras, debido a que hacen cosas o dependen de cosas que no son evidentes por su uso, pueden comportarse de manera impredecible si solo se tiene conocimiento del uso. Se requiere un mayor conocimiento del propósito de la función y, por lo tanto, de lo que necesita del estado externo o lo que necesita para colocar un sistema que lo use en un estado consistente y, por lo tanto, esperar un resultado determinista.