¿Qué hace exactamente que la lectura de la memoria del proceso sea una operación pura? Supongamos que creé una matriz de 100 enteros en la memoria global y luego tomé el elemento 42 de esta matriz. No es un efecto secundario, ¿verdad? Entonces, ¿por qué leer la misma matriz de 100 enteros de un archivo es un efecto secundario?
functional-programming
side-effect
ZhekaKozlov
fuente
fuente
Respuestas:
Si la memoria a la que accede puede cambiar, es un efecto secundario.
Por ejemplo, en Haskell, la función para acceder a una matriz mutable (
IOArray
) tiene tipo(ligeramente simplificado para nuestros propósitos). Al acceder a una matriz inmutable tiene tipo
La primera versión devuelve algo de tipo, lo
IO e
que significa que tiene efectos secundarios de E / S. La segunda versión simplemente devuelve un elemento de tipoe
sin efectos secundarios.En caso de acceder a un archivo, simplemente no puede saber en el momento de la compilación si el archivo cambiará alguna vez durante la ejecución del programa. Por lo tanto, siempre debe tratarlo como una operación con posibles efectos secundarios.
fuente
En informática, se dice que una función o expresión tiene un efecto secundario si, además de devolver un valor, también modifica algún estado o tiene una interacción observable con las funciones de llamada o el mundo exterior. Leer de un archivo es una interacción observable con el mundo exterior. Cumple con la definición de efecto secundario. Leer el elemento 42 de la memoria global también sería un efecto secundario, a menos que su matriz sea una constante porque sería una interacción observable con otras funciones que pueden modificar la matriz.
fuente
Si tiene un identificador de archivo compartido, leer un archivo moverá ese identificador de archivo a la posición donde lo ha leído y lo dejará en esa posición.
Si tiene dos subprocesos con identificadores de archivo separados para el mismo archivo, la lectura de uno no tendrá efectos secundarios notables en el otro.
Sin embargo, en ambos casos, lectura de memoria y lectura de archivos, podría haber un efecto secundario oculto del almacenamiento en caché del sistema del operador.
fuente
Leer de la memoria no influye en otras funciones y, por lo tanto, no tiene efectos secundarios. La lectura de un archivo generalmente moverá el puntero de posición del archivo, de modo que cuando lea de nuevo lea los datos después de lo que ya ha leído, de modo que una función de lectura cambia el resultado de otras funciones de lectura, lo cual es un efecto secundario. Si en su lugar abre, lee y cierra un archivo de una vez, este efecto secundario desaparece, pero eso no es factible para archivos grandes. Además, dependiendo de cómo abra el archivo, puede bloquearse después de abrirlo, por lo que el primer intento de abrir y leer el archivo tiene éxito mientras que los siguientes intentos fallarán con un archivo ya abierto error de , que nuevamente es un efecto secundario.
Crear una función de lectura sin efectos secundarios que lea el archivo de una vez y permita múltiples lecturas al mismo tiempo es difícil porque hay funciones de escritura de archivos que se ven influenciadas por la función de lectura y deshacerse de las funciones de escritura de archivos nuevamente no es factible .
fuente
IO
mónada?), Podrías hacer una función libre de efectos secundarios para la lectura.La lectura de una secuencia ya es un efecto secundario porque el resultado de funciones como
isEOF
puede devolver un resultado diferente después de la lectura que antes de la lectura.fuente