Se la memoria a cui accedi può cambiare, allora è davvero un effetto collaterale.
Ad esempio, in Haskell, la funzione per accedere a un array mutabile ( IOArray
) ha tipo
Ix i => IOArray i e -> i -> IO e
(leggermente semplificato per i nostri scopi). Durante l'accesso a un array immutable ha tipo
Ix i => Array i e -> i -> e
La prima versione restituisce qualcosa di tipo IO e
che significa che ha effetti collaterali I / O. La seconda versione restituisce semplicemente un elemento di tipo e
senza effetti collaterali.
In caso di accesso a un file, semplicemente non puoi sapere al momento della compilazione se il file cambierà durante l'esecuzione del programma. Pertanto, devi sempre trattarlo come un'operazione con potenziali effetti collaterali.