this might be a stupid question, but isn't async/await basically the same as Haskell's monadic IO plus parallelization?
The way I see it, futures returning a data type T are equivalent to Haskell's IO T, declaring a function with return type T to be `async` is the same as declaring its Haskell analogue to have return type IO T, and await is equivalent to >>= and <-. If the asynchronous code in the imperative language is pure, it should even have a 1:1 analogue in Haskell.