While futures and Option and Result all have monadic structure, neither ? nor await! is a general do notation, they are both tailored to the semantics of Option/Result and futures respectively, and consequently they differ significantly from each other:
-
?desguars to an early return -
awaitturns the surrounding function into a state machine that returns and saves its state when encountering a “not ready” future, so it can resume in the same place when polled again. - Neither involves
and_then, for a few reasons:- Simply wrapping the following lines into a closure would affect control flow in there (see pre-RFC: Allow return, continue, and break to affect the captured environment)
- It’s not as simple as putting the following lines in a closure when the
?/awaitis, say, inside a loop. It would effectively require transforming the code into continuation passing style, or doing the aforementioned state machine transform. That’s more or less necessary withawait, but for?it’s unnecessary overhead. - Doing the state machine transform is simpler when you do it on MIR rather than trying to do CPS transforms on AST, it wouldn’t literally desugar to
and_then.