O que exatamente faz da leitura da memória do processo uma operação pura? Suponha que eu criei uma matriz de 100 números inteiros na memória global e depois peguei o 42º elemento dessa matriz. Não é um efeito colateral, certo? Então, por que a leitura da mesma matriz de 100 números inteiros de um arquivo é um efeito colateral?
functional-programming
side-effect
ZhekaKozlov
fonte
fonte
Respostas:
Se a memória que você acessa pode mudar, é realmente um efeito colateral.
Por exemplo, em Haskell, a função para acessar uma matriz mutável (
IOArray
) possui o tipo(ligeiramente simplificado para nossos propósitos). Ao acessar um array imutável, digite
A primeira versão retorna algo do tipo, o
IO e
que significa que possui efeitos colaterais de E / S. A segunda versão simplesmente retorna um elemento do tipoe
sem efeitos colaterais.No caso de acessar um arquivo, você simplesmente não pode saber, em tempo de compilação, se o arquivo será alterado durante a execução do programa. Portanto, você sempre deve tratá-lo como uma operação com possíveis efeitos colaterais.
fonte
Na ciência da computação, diz-se que uma função ou expressão tem um efeito colateral se, além de retornar um valor, também modifica algum estado ou tem uma interação observável com as funções de chamada ou com o mundo exterior. Ler de um arquivo é uma interação observável com o mundo exterior. Ele atende à definição de efeito colateral. A leitura do 42º elemento da memória global também seria um efeito colateral, a menos que sua matriz seja uma constante, pois seria uma interação observável com outras funções que podem modificar a matriz.
fonte
Se você tiver um identificador de arquivo compartilhado, a leitura do arquivo moverá esse identificador para a posição em que você leu e o deixará nessa posição.
Se você tiver dois threads com identificadores de arquivo separados para o mesmo arquivo, a leitura de um não terá efeito colateral perceptível no outro.
No entanto, nesses dois casos, leitura de memória e leitura de arquivo, pode haver um efeito colateral oculto do cache do sistema do operador.
fonte
A leitura da memória não influencia outras funções e, portanto, é livre de efeitos colaterais. A leitura de um arquivo normalmente move o ponteiro de posição do arquivo, de modo que, quando você lê novamente, lê os dados depois do que já leu, para que uma função de leitura altere o resultado de outras funções de leitura, o que é um efeito colateral. Se você abrir, leia e feche um arquivo de uma só vez, para que esse efeito colateral desapareça, mas isso não é possível para arquivos grandes. Além disso, dependendo de como você abrir o arquivo, ele poderá ficar bloqueado após abri-lo. Portanto, a primeira tentativa de abrir e ler o arquivo será bem-sucedida, enquanto as tentativas seguintes falharão com um erro de arquivo já aberto , o que novamente é um efeito colateral.
Criar uma função de leitura sem efeitos colaterais que leia o arquivo de uma só vez e permita várias leituras ao mesmo tempo é difícil, porque há funções de gravação de arquivo que são influenciadas pela função de leitura e livrar-se das funções de gravação de arquivo também não é possível. .
fonte
IO
mônada?), Você poderia criar uma função sem efeitos colaterais para a leitura.A leitura de um fluxo já é um efeito colateral, porque o resultado de funções como
isEOF
pode retornar resultados diferentes após a leitura e antes da leitura.fonte