Earlier quoted context omitted.
> As soon as you have side-effects (an IO is a side-effect) you can through your assumptions about "strict conformation to definition" out of the window Again, you are unfortunately quite wrong. You do not understand the IO Monad. No IO is ever performed in any code written inside the IO monad (unless using unsafePerformIO). Please take some time to fully understand Haskell before criticising it so openly on a public…
Basically, the moment you have readFile :: FilePath -> IO String writeFile :: FilePath -> String -> IO () and any function invoking those two (and any functions invoking these function etc. etc.) your "haskell strictly conforms to FP definition" flies out of the window. And yes: I used the term "IO monad" incorrectly.
All composition of IO actions is performed with full referential transparency and adherence to the Wikipedia definition.