Skip to content

Better diagnostics when using "as alias" in binding without wrapping expression in parens #5259

@smoothdeveloper

Description

@smoothdeveloper

When giving alias via as, the first element of a tuple can be matched without wrapping it between parens, while the same doesn't work for any other items in the tuple.

let foo a b = 
  match a, b with
  | Some _ as aa, None -> aa, None
  | None, Some _ as bb -> None, bb // doesn't compile

This expression was expected to have type ''a option' but here has type ''b option * 'c option'

if I wrap the second tuple element in the match in parens, it compiles:

let foo a b = 
  match a, b with
  | Some _ as aa, None -> aa, None
  | None, (Some _ as bb) -> None, bb

This seems to be inconsistent behaviour, failing principle of least surprise, and leading to confusing error message.

Is it according to spec or some issue that needs to be fixed? Should the parens be mandatory or optional in that case?

Reproduces in VS2015 and VS2017.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    Status

    New

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions