Isn't this a requirement (the use of the type system for annotating purity), not something that is just "possible". And isn't that what people generally mean by its purity?
Isn't this a requirement (the use of the type system for annotating purity), not something that is just "possible". And isn't that what people generally mean by its purity?
Some people get confused between purity and expressiveness. Inexpressive languages like C require using impure constructs to represent fundamentally pure constructs. More expressive languages like Python don't need as many impure workarounds. Haskell, as a very expressive language, can do amazing things in pure code that other languages must resort to impurity for.
If you want a pure language, look into Agda or Coq.
Haskell was historically pure and had side effects added as a way to interact with the world. The language enforces (discounting unsafePerformIO) the separation of pure and impure code. That is sufficient to label any practical language pure.
That's actually not true -- you can write the core of a system in a pure language, then use that pure core as a library in larger applications. Pure languages like Coq and Agda are often not Turing-complete, so various sorts of verification and proofs can be applied more easily.