En Lenguajes de programación, ¿cuál es la diferencia entre los efectos secundarios abstractos y los efectos secundarios concretos?

El efecto secundario abstracto es cuando evalúa alguna expresión que cambia algunas variables pero el resultado de la expresión que ignora.

Digamos que comprueba si function () = true y luego no hace nada;

No hace nada, pero aún así, dentro de la función () cambia el valor de la variable global. Es un efecto secundario abstracto.

El otro grupo de efectos secundarios es el que cambia de estado. Supongamos que function () lee algún archivo del disco y lo llama en la misma expresión si function () = true y luego no hace nada;

No hace nada en el flujo de tu programa. Pero probablemente en el sistema donde ejecutas tu programa hay muchos cambios reales. El archivo está almacenado / almacenado en caché en la memoria. Tal vez haya tenido que eliminar de la memoria algún otro archivo almacenado / guardado en memoria caché para hacer lugar para el que lee con su función. Tal vez la lectura mostrada a algún subsistema de disco que ‘tu’ archivo está muy fragmentada e inició un proceso de desfragmentación que bloqueará el archivo exclusivamente durante unos minutos. Tal vez su intento de abrir el archivo hizo que fallara otro programa paralelo porque alcanzaba los límites de los archivos abiertos en el sistema. Cosas como esas.