Non posso parlare di Clojure, ma posso dire che Haskell ha a disposizione molti pacchetti di I / O molto ottimizzati che permetteranno tutte le mutazioni che potresti desiderare.
Ecco una risposta a una domanda che ho scritto dove qualcuno descrive i 3 più comuni e riguarda le loro prestazioni: link
Puoi anche vedere qui un semplice grafico che mostra le metriche di rendimento di un server web haskell chiamato Warp, che è un'applicazione altamente intensiva di IO.
C'è molta confusione riguardo a Haskell, la verità è che ha delle fantastiche strutture IO con molti pacchetti in hackage per usare IO in molti modi diversi, molti dei quali sono stati altamente sintonizzati. La ragione per cui la gente presume che non sia così è perché Haskell fa di tutto per separare IO da tutto il resto, ma ciò non ha alcun effetto sulle caratteristiche delle prestazioni.
Ora per parlare delle caratteristiche delle prestazioni, tuttavia, la ragione per cui le persone riconoscono che le loro prestazioni sono scadenti è dovuta alla pigra valutazione che lo fa comportarsi in modi che non sono sempre intuitivi. Questo è comunque qualcosa che devi preoccuparti di molto meno quando inizi a lavorare in un contesto IO facendo aggiornamenti distruttivi come in un sistema a cui ti stai riferendo. Inoltre, le persone tendono a scoprire che quando hanno problemi di prestazioni, le strutture incorporate per lo strumento e l'identificazione delle risorse disponibili aiutano molto.
Un'altra monade che vale la pena di cercare per un sistema come te descritto sarebbe monad ST che è specifico per gli aggiornamenti distruttivi fatti da piccolissime chiamate IO che gli danno grandi prestazioni.
Mi dispiace davvero non posso parlare con Clojure, spero che qualcun altro possa fornire dettagli lì.