I have always thought that monads are just side effects and that's it.
It's all about getting an intuition for how many things fit the shape:
flatMap :: m a -> (a -> m b) -> m b
Where "flatMap" might have different names in different types. Once you see that pattern in some code, you'll start seeing it in a lot of other places.Monads are just a pattern for chaining functions.