f# - 为什么在使用绑定(bind)到 `let` 的联合类型成员时需要括号?

标签 f#

具有以下类型:

type MyType =
    | MyType of string

我尝试这样做:

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

这会导致编译错误:

The value or constructor y is not defined.

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

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

两个版本有什么区别?

最佳答案

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

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

需要使用括号来区分解构和函数声明。

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

let myFunc (MyType y) =
    y

关于f# - 为什么在使用绑定(bind)到 `let` 的联合类型成员时需要括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217240/

相关文章:

f# - Fable/F# - 如何将枚举或有区别的联合保存到浏览器?

f# - 带有类型提供者的可移植库

.net - 当 F# 中的类型提供程序更改时会发生什么?

visual-studio - f# 的响应式(Reactive)扩展

heroku - 为什么数组中的记录会导致heroku 中的类型初始值设定项错误?

unit-testing - 如何使用 FsCheck 生成随机数作为基于属性的测试的输入

F# 模式匹配异常

.net - F# printfn "%A"到剪贴板

f# - 如何为一个值分配一个大数?

list - 为什么 F# 无法对列表元素进行类型推断?