Hacker News new | ask | show | jobs
by elcritch 604 days ago
My belief is that errors should be handled using effect systems. So in the signature but not muddying the actual return types.

Useful effect systems allow the end user to decide where and when to have the compiler enforce errors are handled. Nim has had an effect system for a while but became much more useful when `forbids: [IOError]` was added. It makes it easy to ensure certain type of errors are handled at specific points.

More languages should embrace effect systems. Ocaml's is even used to implement multithreading support, albeit effect systems vary widely in design and theory.

1 comments

I mean this is how a lot of exceptions are handled, even in C++. You can use noexcept and whatnot and you don't have to change types and propagate them out. In Rust, you do. Java has maybe the strongest system because not only do you have to declare what can throw but it checks it at compile-time. That's, to me, a full featured effect system.

But errors-as-values are all the rage today. But modifying types, especially every type in the chain, is annoying and overly manual IMO.

Yeah, Java had some good ideas but just not quite there on the UX, like many things with Java sigh.

Checked exceptions were annoying because you had to manually annotate the exceptions all the way up your chain. The list of effects should be generated by the compiler, and the IDE should show them when desired. Maybe manually annotated at external API boundaries which double as forcing the API dev to handle unlisted exceptions.