News for hackers. Stuff that matters.
Re:Exotic Programming Ideas, Part 3: Effect Systems by skybrian on Sunday November 22, 2020 @03:38PM (#25180839)
There is the specific issue with async functions, but that's only one example of a general problem, what I'm calling "function coloring." Workarounds are often possible, but they are still workarounds and often result in bad code.

We've been there with Java. An API takes a Runnable. You need to do something that does IO, so you catch the exception... and then what? Log and suppress it? This is how bad code happens. At best you get chained exceptions.

With Callable, they got smarter and declared it to throw Exception, which means it can only be easily propagated by other methods that declare they throw Exception. So it's a viral declaration, unless you engage in workarounds like exception wrapping.

You don't need an effect system for this to happen, though. In Go, you don't have the problem with different kinds of errors, but you can still classify functions into two categories: those that may return an error, and those that (apparently) always succeed. If you need to fix the API, you might end up with lots of refactoring [1].

Mistakes at the API level can be hard to fix without touching lots of API's. This is unsolvable in general. The only way to avoid workarounds (via escape hatches or by mocking things out) is to standardize whatever you can so it works together.

[1] https://www.dolthub.com/blog/2020-11-16-panics-to-errors/

Re:Exotic Programming Ideas, Part 3: Effect Systems by lalaithion on Sunday November 22, 2020 @04:48PM (#25181408)
Nothing prevents having a type system capable of dealing with those problems. Yes, Java and Golang make this difficult, but if you have a language that supports it, there's nothing which prevents writing an API that says "Whatever the effects of the Callable you passed me are, I also perform those effects".
Re:Exotic Programming Ideas, Part 3: Effect Systems by skybrian on Sunday November 22, 2020 @05:17PM (#25181642)
Introducing generic types doesn't make the function-coloring problem go away.

Now, instead of having a single function that has some effects, you have a family of closely-related functions, each with different effects. These functions are incompatible with each other. The function-coloring problem has gotten worse! :)

(Generic types are still useful though.)

Re:Exotic Programming Ideas, Part 3: Effect Systems by lalaithion on Monday November 23, 2020 @12:48PM (#25189422)
No, it doesn't make it go away, but it makes the "function coloring problem" about as much a problem as the "colors" of functions as determined by their return types. You can't pass a `func () string` to an api accepting a `func () int`.
Re:Exotic Programming Ideas, Part 3: Effect Systems by karlicoss on Sunday November 22, 2020 @08:45PM (#25182825)
And indeed, JS Flow detects such async issues pretty well