Una risposta semplificata è: quando vedi un nome in un linguaggio puramente funzionale, sai qual è il valore associato con una semplice ricerca della sua definizione. Se hai variabili mutabili, puoi solo dire quale delle varie assegnazioni è stata eseguita per ultima, quindi devi anche analizzare il flusso di controllo, che a sua volta potrebbe essere condizionale, lasciandoti con molteplici possibilità. Per ottenere un'esplosione esponenziale devi solo considerare che gli RHS dei compiti dipendono essi stessi da variabili, quindi devi analizzarli in modo ricorsivo.
La linea di fondo nell'analisi precedente è che è insostenibile senza commenti che spieghino l'intento, le invarianti e la semantica: possono essere difficili da interpretare e potrebbe essere difficile verificare che la semantica sia rispettata nel codice reale.
Questa risposta è fondamentalmente un'espansione del punto 1 di @ Javier.
Penso che sia anche una spiegazione della popolarità del regime OO fraudolento: con OO lo stato mutabile è incapsulato il che rende l'analisi molto più semplice localizzando le mutazioni in una certa misura e permettendo un'espressione molto più robusta e la verifica di la semantica.
Avendo notato che la programmazione funzionale non è la risposta. La risposta corretta è un sistema che supporta sia la programmazione induttiva (funzionale) che quella coinduttiva (procedurale), quindi gli strumenti giusti possono gestire sia la programmazione stateless che quella stateful. È solo che la teoria costruttiva (funzionale) è ben consolidata mentre la teoria della gestione dello stato è ancora agli inizi.