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
Ix i => IOArray i e -> i -> IO e
(ligeiramente simplificado para nossos propósitos). Ao acessar um array imutável, digite
Ix i => Array i e -> i -> e
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 tipo e
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.