You don't need an effect system

How we got here

A couple of months ago something rather unusual happened: I got permission to rewrite an old production codebase. Nothing wild inside, just a few services bouncing messages around and calling other places. I wrote most of it years ago, and most of it was god awful on account of the fact that I had no idea what I was doing at the time.

Like any real codebase written in Haskell, it relied on an effect system to do… well, things.

Indeed, like most of the community, I couldn't properly formulate what an effect system does. Yes, I know there are at least ten of them, all at odds with one another, yet seemingly completely interchangeable. Smarter people have narrowed the goals down to tracking effects, mocking and internal consistency, which strongly implies that plain IO is incapable of these things, and that's something I could neither confirm nor deny.