The problem with monads in Haskell is a chicken-and-egg problem. When an ordinary programmer (as oppossed to a mathmatician) starts toying with a new language, they usually start with some simple IO code (starting from "hello world") and play and explore their way deeper into the language. In Haskell, however, you don't get much further than "hello world" before you bang your head against the IO monad. Hence the monad totorials aimed at newbies. The problem is that to understand monads you have to understand a lot of other advanced Haskell features like type constructors, type classes, type inference, partial functions and so on.
I think the solution is to realize that you dont need to understand monads to write IO code, you just need to understand the rules of do-notation. Sure, do-notation is implemented using monads under the hood, but you dont need to understand monads to use it, just as you dont need to understand vtables to use objects.
I should propably write a do-notation tutorial to show how far you can get without understanding monads.
I think the solution is to realize that you dont need to understand monads to write IO code, you just need to understand the rules of do-notation. Sure, do-notation is implemented using monads under the hood, but you dont need to understand monads to use it, just as you dont need to understand vtables to use objects.
I should propably write a do-notation tutorial to show how far you can get without understanding monads.