Skip to content

Forbid CE syntax which misleadingly looks like an early return #15759

@Smaug123

Description

@Smaug123

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.RunSynchronously

I 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?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions