concept putStrLn in category haskell
appears as: putStrLn

This is an excerpt from Manning's book Get Programming with Haskell.
If main isn’t a function, it should follow that neither is putStrLn. You can quickly clear this up by looking at putStrLn’s type:
As you can see, the return type of putStrLn is IO (). Like main, putStrLn is an IO action because it violates our rule that functions must return values.