I think mainly as an optimization: it saves the coroutine runtime from having to dispatch to a different thread if the coroutine doesn’t care what thread it’s executing on.
It also has the nice property, when integrating with non-coroutine APIs like RxJava, that any call “into” the coroutines world (e.g., `offer`ing to a channel) will complete “synchronously”. So if your channel offer allows some coroutine to resume, calculate some values, and re-emit them back to RxJava, then that emission will happen before the
offer
returns. The
Main.immediate
dispatcher on Android has similar behavior, which makes it easier to reason about changes to the UI.