This is really just a syntactical issue. Not one of types or semantics.

Non trivial operations have errors when the happy path fails. And with web apps IO can fail anytime, anywhere for any reasons.

Sometimes you want to handle them locally, sometimes globally. The question is how ergonomic it is to handle this all for a variety of use cases.

We keep reinventing the wheel because we insist that our own use cases are “special” and “unique”, but they really aren’t.

Personally, I think Java’s proposal on catching errors in switches, next to ordinary data is the right step forward.

Monads are great. You can do lots of great things in them, but ergonomic they are not. We should avoid polluting our type systems where possible.

For Turing Complete languages everything is just a syntactical issue (Turing Tarpit).

And syntax is what most programmers will complain about. Even if it makes the wrong code easier to type.

Ah yes, -2. Predictable result on this emotional topic.