After touching on Monads in respect to functional programming, does the feature actually make a language pure, or is it just another \"get out of jail free card\" for reason
Is Haskell truly pure? [...]
The Haskell language was pure; the last version being Haskell 1.2. Back then, the type of main was:
main :: [Response] -> [Request]
which was usually abbreviated to:
main :: Dialogue
where:
type Dialogue = [Response] -> [Request]
and Response along with Request were humble, albeit large datatypes:

The advent of I/O using the monadic interface in Haskell changed all that - no more visible datatypes, just an abstract specification. As a result, how IO, return, (>>=) etc are defined is now specific to each implementation of Haskell.
So the question is now:
As Owen Stephens notes in Approaches to Functional I/O:
I/O is not a particularly active area of research, but new approaches are still being discovered [...]
The Haskell language may once again have a pure, fully-defined model for I/O...