-
Notifications
You must be signed in to change notification settings - Fork 831
Description
Is your feature request related to a problem? Please describe.
The following code compiles, but its semantics are not at all obvious: the return keyword is not in fact returning anything, and it prints "Here".
async {
if true then
return ()
printfn "Here"
return ()
}
|> Async.RunSynchronouslyI claim this behaviour is very counterintuitive, because return is explicitly a word from the imperative paradigm, but it does not behave like the corresponding imperative construct.
(Note that if you try and early-return anything other than unit, you are correctly told that the thing you're trying to return needs to be of unit type to satisfy the constraint that it's the body of an if block.)
Describe the solution you'd like
A warning indicating that this code likely does not do what I expect, suggesting that I remove the return keyword.
I don't know how wide-ranging this problem is, because I haven't thought hard about it. Does the warning make sense only for the async computation expression, or will it have similarly unexpected semantics in every computation expression that implements Return?