F# 形式的值是具有特定类型的数量;值可以是整数或浮点数、字符或文本、列表、序列、数组、元组、可区分联合、记录、类类型或函数值。

绑定值

术语“绑定”意指将名称与定义关联。 let 关键字将绑定值,如下例所示:

let a = 1
let b = 100u
let str = "text"

// A function value binding.

let f x = x + 1

值的类型根据定义推断得出。 对于基元类型(例如整数或浮点数),类型由文本的类型确定。 因此,在前面的示例中,编译器将 b 的类型推断为 unsigned int,而将 a 的类型推断为 int。 函数值的类型由函数体中的返回值确定。 有关函数值类型的详细信息,请参阅函数。 有关文本类型的详细信息,请参阅文本

默认情况下,编译器不会发出有关未使用绑定的诊断。 若要接收这些消息,请在项目文件中启用警告 1182,或在调用编译器时启用它(请参阅编译器选项下的 --warnon)。

为何不可变?

不可变值是指在程序的整个执行过程中无法更改的值。 如果习惯于使用 C++、Visual Basic 或 C# 之类的语言,可能会惊奇地发现,F# 认为不可变值最为重要,而不是可在程序执行过程中赋予新值的变量。 不可变数据是函数编程中的一个重要元素。 在多线程环境中,可由许多不同线程更改的共享可变变量管理起来很困难。 此外,若使用可变变量,有时很难判断变量在传递到另一个函数时是否可更改。

纯粹的函数语言中没有变量,函数的行为与数学函数的行为类似 - 常的严格。 如果过程语言中的代码使用变量赋值来更改值,函数语言中的等效代码会有一个作为输入的不可变值、一个不可变函数以及作为输出的其他不可变值。 这种数学严格性实现了有关程序行为的更严格推理。 通过这种更严格的推理,编译器将能够更严格地检查代码,并更有效地进行优化,还可以让开发人员更轻松地理解和编写正确的代码。 因此,与普通的过程代码相比,函数代码可能更易于调试。

F# 不是纯粹的函数语言,但它完全支持函数编程。 使用不可变值是一种很好的做法,因为这样做可以使代码从函数编程的一个重要方面中获益。

可变变量

可使用关键字 mutable 指定可以更改的变量。 F# 中的可变变量范围通常有限,要么是类型字段形式,要么是本地值形式。 具有有限范围的可变值更易于控制,并且被错误修改的可能性也更小。

可以使用 let 关键字,采用像定义值一样的方式将初始值赋给可变变量。 但区别在于,随后可以使用 <- 运算符将新值赋给可变变量,如下例所示。

let mutable x = 1
x <- x + 1

如果闭包(包括创建闭包的窗体,如 seq 生成器)捕获标记为 mutable 的值,可能会将其自动提升为 'a ref。 如果希望在发生这种情况时收到通知,请在项目文件中或在调用编译器时启用警告 3180。

Title 说明
let 绑定 提供有关使用 let 关键字的信息,将名称绑定到值和函数。
函数 提供 F# 中函数的概述。

另请参阅