IO itself is not hard, what's difficult is <i>async</i> IO. The solution has always been to think of it as serial - flat-mapping it into a serial timeline. I however think that it's better to embrace the "async" eg that things can happen anywhere and at any time, and deal with it using event-driven programming patterns.