Qu'est-ce qui fait de la lecture de la mémoire de processus une opération pure? Supposons que j'ai créé un tableau de 100 entiers dans la mémoire globale, puis pris le 42e élément de ce tableau. Ce n'est pas un effet secondaire, non? Alors, pourquoi la lecture du même tableau de 100 entiers dans un fichier est-elle un effet secondaire?
functional-programming
side-effect
ZhekaKozlov
la source
la source
Réponses:
Si la mémoire à laquelle vous accédez peut changer, c'est en effet un effet secondaire.
Par exemple, dans Haskell, la fonction pour accéder à un tableau mutable (
IOArray
) a le type(légèrement simplifié pour nos besoins). Lors de l'accès à un tableau immuable de type
La première version renvoie quelque chose de type,
IO e
ce qui signifie qu'elle a des effets secondaires d'E / S. La deuxième version renvoie simplement un élément de typee
sans aucun effet secondaire.En cas d'accès à un fichier, vous ne pouvez tout simplement pas savoir au moment de la compilation si le fichier changera jamais au cours d'une exécution du programme. Par conséquent, vous devez toujours le traiter comme une opération avec des effets secondaires potentiels.
la source
En informatique, une fonction ou une expression est censée avoir un effet secondaire si, en plus de renvoyer une valeur, elle modifie également un état ou a une interaction observable avec les fonctions d'appel ou le monde extérieur. La lecture d'un fichier est une interaction observable avec le monde extérieur. Il répond à la définition de l'effet secondaire. La lecture du 42e élément de la mémoire globale serait également un effet secondaire, à moins que votre tableau ne soit une constante, car ce serait une interaction observable avec d'autres fonctions qui pourraient modifier le tableau.
la source
Si vous avez un descripteur de fichier partagé, la lecture d'un fichier le déplacera à la position où vous l'avez lu et le laissera à cette position.
Si vous avez deux threads avec des poignées de fichier distinctes vers le même fichier, la lecture de l'un n'aura aucun effet secondaire notable sur l'autre.
Cependant, dans ces deux cas, la lecture de la mémoire et la lecture des fichiers, il peut y avoir un effet secondaire caché de la mise en cache du système opérateur.
la source
La lecture à partir de la mémoire n'influence pas les autres fonctions et est donc sans effet secondaire. La lecture à partir d'un fichier déplace généralement le pointeur de position du fichier, de sorte que lorsque vous relisez, vous lisez les données après ce que vous avez déjà lu, donc une fonction de lecture modifie le résultat des autres fonctions de lecture, ce qui est un effet secondaire. Si vous ouvrez, lisez et fermez un fichier en une seule fois, cet effet secondaire disparaît, mais ce n'est pas possible pour les gros fichiers. En outre, selon la façon dont vous ouvrez le fichier, il peut se verrouiller après l'avoir ouvert, de sorte que la première tentative d'ouverture et de lecture du fichier réussit tandis que les essais suivants échouent avec une erreur de fichier déjà ouvert , ce qui est encore un effet secondaire.
Il est difficile de créer une fonction de lecture sans effet secondaire qui lit le fichier en une seule fois et permet plusieurs lectures en même temps car il existe des fonctions d'écriture de fichier qui sont influencées par la fonction de lecture et se débarrasser des fonctions d'écriture de fichier n'est à nouveau pas possible .
la source
IO
monade?) Que vous pourriez créer une fonction sans effet secondaire pour la lecture.La lecture à partir d'un flux est déjà un effet secondaire car le résultat de fonctions telles que
isEOF
peut retourner un résultat différent après la lecture qu'avant la lecture.la source