为什么在使用绑定到`let`的union类型的成员时需要括号?

时间:2018-01-11 23:06:42

标签: f#

具有以下类型:

type MyType =
    | MyType of string

我试着这样做:

let myFunc x =
    let MyType y = x
    y // Compilation error

这会导致编译错误:

  

未定义值或构造函数 y

但是,如果我在MyType y附近加上括号,则代码会编译。

let myFunc x =
    let (MyType y) = x
    y // Compiles successfully

两个版本之间有什么区别?

1 个答案:

答案 0 :(得分:4)

第一个版本声明了一个名为MyType的函数,其中一个参数名为y。此参数仅在此函数的正文中可用,因此当您尝试在函数外部访问此参数时会出现错误。

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

必要时用括号区分解构和函数声明。

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

let myFunc (MyType y) =
    y