Parece que, al leer algo como este artículo de Wikipedia sobre "funciones puras" , se enumeran Today()
como un ejemplo de una función impura, pero me parece bastante puro. ¿Es porque no hay un argumento de entrada formal? ¿Por qué la hora real del día no se trata como la "entrada a la función" today()
? )), la salida sería al mismo tiempo. Today()
nunca te da un número al azar. siempre te da la hora del día.
El artículo de Wikipedia dice "diferentes tiempos producirá diferentes resultados", pero eso es como decir que para diferentes x
sin(x)
te dará diferentes proporciones. Y sin(x)
es su ejemplo de una función pura.
terminology
functions
Puntilla
fuente
fuente
Respuestas:
Es porque la salida depende de algo que no es una entrada, es decir, la hora actual.
Porque no lo pasaste como parámetro. Si lo pasara como parámetro, la función se convertiría en una función de identidad en las fechas, lo cual es bastante inútil. El objetivo de una
Today()
función es generar algo que depende de un valor externo (constante) (tiempo).La ventaja de las funciones puras es que su comportamiento es absolutamente reproducible y determinista, lo que facilita tener pruebas formales y garantías estrictas. Siempre hacen lo mismo.
Today()
es todo lo contrario: siempre (permitiendo granularidad de tiempo) hace algo diferente.fuente
Today()
) seToday()
vuelve impuro. LaToday()
función podría ser un ejemplo un poco tonto. Más apropiado podría ser algunaCount()
función. Dado el mismo número de elementos a contarCount()
, siempre se devolverá el mismo número, pero dado que eso está fuera del alcanceCount()
, es impuro.count()
en la mayoría de los lenguajes de programación es definitivamente puro. Tiene un valor de entrada explícito: la colección cuyo recuento desea. No se confunda con una sintaxis comomyCollection.count()
; eso es solo azúcar paracount(myCollection)
.sin(x)
siempre devolverá el mismo valor, siempre quex
permanezca igual.Today()
podría devolver resultados diferentes con el tiempo porque depende de valores fuera de su control . Por ejemplo, si algo más allá del control de su programa cambia el sistema interno del sistema$current_datetime
mientras su programa se está ejecutando, deToday()
repente producirá resultados diferentes.fuente
Today()
volvería "jueves" un lunes.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 puedesAdd(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.
fuente
Parece bastante obvio que esta función falla la primera prueba de pureza dada al comienzo de esa página:
Tenga en cuenta que, dado que no requiere argumentos, solo hay un conjunto posible de valores de argumento: el conjunto vacío. Y esta función puede devolver resultados diferentes para el mismo 'valor (es) de argumento'.
Además, el valor resultado de la función no depende de "... estado oculto que puede cambiar a medida que avanza la ejecución del programa". Entonces otro fracaso.
fuente
() => 1
sería una función pura, ya que siempre devuelve 1.Today()
puede devolver "lunes" o "martes" o casi cualquier otro valor.Otra forma de pensar es que las funciones puras no dependen del estado. El mundo generalmente se considera estado. Necesita saber el estado de la realidad para saber qué día es hoy.
Sin embargo, no necesita saber nada especial sobre el estado del mundo para saber qué
sin(x)
es. Y siempre llamar asin(x)
un determinadox
devolverá el mismo valor.fuente
Date(timestamp)
Sería una función pura. Por su idempotencia. Y porque no habría efectos secundarios.Today()
puede variar su resultado dependiendo de cuándo lo llame. Eso es lo que lo hace impuro. No es idempotente. Sin embargo, no tiene efectos secundarios, pero eso no lo hace puro.fuente
Aquí hay un pequeño pseudocódigo en el que pienso cuando hablo de funciones puras
Si eso se ejecuta indefinidamente y nunca puede activar la afirmación, es una función pura. Más aún, si tiene una función que usa args, entonces una pequeña modificación ...
Si puede usar eso después de cada asignación de variables en su aplicación, y no cambia los resultados en su aplicación, y nunca puede fallar la afirmación, entonces es una función pura.
fuente
Primero, no existe una función sin argumento (o una matriz sin índices o un mapa sin claves). Es la característica definitoria de una función asignar uno o más valores de argumento a otro valor.
Por lo tanto,
today
tampoco es una función en absoluto, por lo tanto, no es una función pura. O podemos interpretar la sintaxisun poco para que signifique
En Haskell, por ejemplo, esto sería válido:
porque hay un tipo () con un solo valor ().
La pregunta es solo, ¿cómo se puede
today
calcular el día de la semana, si solo tiene ()? Simplemente no es posible sin leer el temporizador del sistema, directamente o mediante funciones auxiliares impuras.El temporizador del sistema es un excelente ejemplo para el estado global.
fuente
El problema
today()
es que puede producir un resultado diferente si se llama dos o más veces en una función.Aquí hay un ejemplo de código que podría introducir un error.
Es posible en el ejemplo anterior. Que la segunda
if
declaración no se ejecutará. Incluso si el primero lo hizo. Dejar un recurso en mal estado.fuente
Para ser una función pura, proporcionar los mismos parámetros debe dar el mismo resultado cada vez.
Cada vez que llamamos
Today()
, le proporcionamos los mismos parámetros (ninguno) y, sin embargo, no necesariamente obtenemos el mismo resultado (lunes, martes, etc.).fuente