为什么在使用绑定到“let”的联合类型成员时需要括号?

Kap*_*pol 2 f#

具有以下类型:

type MyType =
    | MyType of string
Run Code Online (Sandbox Code Playgroud)

我尝试这样做:

let myFunc x =
    let MyType y = x
    y // Compilation error
Run Code Online (Sandbox Code Playgroud)

这会导致编译错误:

值或构造函数y未定义。

但是,如果我在 周围加上括号MyType y,代码就会编译。

let myFunc x =
    let (MyType y) = x
    y // Compiles successfully
Run Code Online (Sandbox Code Playgroud)

这两个版本有什么区别?

Fyo*_*kin 5

第一个版本声明一个MyType带有一个名为 的参数的函数y。此参数仅在此函数体中可用,因此当您尝试在函数外部访问此参数时,您会收到错误。

第二个版本使用名为 的构造函数解构一个值MyType,将其内容绑定到标识符y。然后,该标识符一直可用,直到当前作用域结束。

括号是区分解构和函数声明所必需的。

在这种特殊情况下,您可以通过将其移至参数列表来简化解构:

let myFunc (MyType y) =
    y
Run Code Online (Sandbox Code Playgroud)