Functional programming is about sharing information through function composition, recursion but not through shared state/memory. In other words, move (move semantics would be considered purity preserving in that sense). Asynchronous
Asynchronous programming is an orthogonal paradigm, itto functional programming. Asynchronous programming is merely about how should tasks/chunks of work be scheduled "in the future" as a response to events, including. Events include task invocation/scheduling events internally generated from your programat run-time. As opposed
Contrary to your reasoning, and as long as state information of a task/function is fully encapsulated within the closure/scope of that function, I do not see how thisasynchronous programming would violate purity as such. In other words, I see asynchronous programming naturally co-existing with functional programming, as long as we keep all our functionstasks/taskschunks of work pure/stateless. For example, in a pure function, program counter (state) must not exist, thus we cannot generate events/function invocations in a sequence of lines"calls" inside the "function"from inside an asynchronous task as no such thingprogram counter state should exist. I would think Instead, functional primitives for function composition should be asynchronously scheduled instead.
Think of a language like Haskell yet compiled underneath toruntime that implements purely functional code as asynchronous invocations of functions. The asynchrony in this case is totally hidden from the developer, as it turns out to be more of an implementation detail, thus hiding any state required for its operation, inside the compiled code, assumed to be correctruntime.
Long story short, you can very well gain the benefits of both worlds by hiding asynchrony in the wayto part of the functional language compiler implements the generated coderuntime.