The way I often explain it to a C++ developer is by asking this question:
"what if the semi-colon was merely an operator, that you can overload?"
Then they sort of start to see the power.
Then they sort of start to see the power.
But, it allows them to see how you could build fiber/promises/lightweight_threads support using this concept, which is most of the times what they are interested in anyway.
Well, C++ is entirely run on IO, so `a :: IO a`. It's exactly the first argument of Haskell's `(>>)` when specialized into IO.
That's a description of the monad pattern in terms of semicolon overloading.