La maggior parte dei cosiddetti linguaggi immutabili fornisce una backdoor che ti consente di sfuggire all'immutabilità e utilizzare strutture dati mutevoli. Ad esempio, Haskell fornisce la monade ST e la capacità di memorizzare dati mutabili con la monade IO. Ha anche una funzione "unsafePerformIO" che puoi usare per eseguire operazioni IO in un contesto che non è dichiarato di utilizzare la monade IO. È possibile utilizzare questi elementi costitutivi di base per eseguire la memoizzazione (e in quanto tale un'implementazione dovrebbe essere visibilmente trasparente in modo referenziale, non è pericoloso farlo (nonostante l'avviso di poppa nel nome della funzione)).
Posso quindi vedere le possibili firme per una funzione di memoize:
mwmoizeST :: (a -> b) -> a -> ST s b
memoizeIO :: (a -> b) -> a -> IO b
memoizeUmsafeIO :: (a -> b) -> a -> b
Tutto potrebbe essere utile in diverse circostanze.
Altre lingue simili offrono simili escape hatch - hanno devono , poiché a volte una struttura mutevole è l'unico modo per ottenere prestazioni soddisfacenti.