There's escape hatches here and there. If you need imperative code, use IO or ST. If you need to debug output something, Debug.Trace.
If you need to temporarily bypass purity there's unsafePerformIO and friends (or they can occasionally be used permanently if you do a lot of analysis I believe).
It's a pretty practical language compared to its reputation.