Pregunta

Tenga en cuenta: mediante un " puro " función, no me refiero a "virtual puro"
Me refiero a esto

Si una función " lee " algún estado global, ¿eso automáticamente lo hace impuro? ¿o depende de otros factores?

Si automáticamente lo vuelve impuro, explique por qué.

Si depende de otros factores, explique cuáles son.

¿Fue útil?

Solución

A "puro" función es una función cuyo resultado depende solo de sus argumentos de entrada. Si lee algo más, no es una función pura.

Otros consejos

En ciertos casos especializados, sí. Por ejemplo, si tuviera una memoria caché global de valores ya calculados que solo fuera leída y escrita por su función, seguiría siendo matemáticamente pura, en el sentido de que la salida solo dependía de las entradas, pero no sería pura en el sentido mas estricto. Por ejemplo:

static int cache[256] = {0};
int compute_something(uint8_t input)
{
    if(cache[input] == 0)
        cache[input] = (perform expensive computation on input that won't return 0);
    return cache[input];
}

En este caso, siempre que ninguna otra función toque el cache global, sigue siendo una función matemáticamente pura, aunque técnicamente depende del estado global externo. Sin embargo, este estado es solo una optimización del rendimiento: todavía realizaría el mismo cálculo sin él, solo que más lentamente.

  

Se requieren funciones puras para construir expresiones puras. Las expresiones constantes son puras por definición.

Entonces, si su 'estado' global no cambia, está bien.

Consulte también transparencia referencial :

  

Un ejemplo más sutil es el de una función que utiliza una variable global (o una variable de ámbito dinámico, o un cierre léxico) para ayudarlo a calcular sus resultados. Como esta variable no se pasa como un parámetro, pero puede modificarse, los resultados de las llamadas subsiguientes a la función pueden diferir incluso si los parámetros son idénticos. (En la programación funcional pura, la asignación destructiva no está permitida; por lo tanto, una función que utiliza variables globales (o dinámicamente delimitadas) sigue siendo referencialmente transparente, ya que estas variables no pueden cambiar).

En Haskell, por ejemplo, puedes crear una lista interminable de números aleatorios en el lado impuro y pasar esa lista a tu función pura. La implementación generará el siguiente número que su función pura está usando solo cuando lo necesita, pero la función sigue siendo pura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top