"Purely functional" is a misnomer. A better description is "typed effects". Haskell doesn't forego effects, it types them. You still have imperative destructive updates if you need them (e.g: to avoid a logarithmic complexity hit, or a constant performance hit). You still may want to write imperative programs, often-times as the backend of a pure functional interface.
Haskell is actually quite good at it, and jokingly referred to as "the world's finest imperative language".
Haskell is actually quite good at it, and jokingly referred to as "the world's finest imperative language".