F# 中的值是具有特定类型的数量;值可以是整型或浮点数、字符或文本、列表、序列、数组、元组、区分联合、记录、类类型或函数值。
绑定值
术语 绑定 意味着将名称与定义相关联。 关键字 let
绑定值,如以下示例所示:
let a = 1
let b = 100u
let str = "text"
// A function value binding.
let f x = x + 1
从定义推断值的类型。 对于基元类型(如整型或浮点数),类型根据文本的类型确定。 因此,在前面的示例中,编译器推断其类型b
unsigned int
,而编译器推断其类型。int
a
函数值的类型根据函数正文中的返回值确定。 有关函数值类型的详细信息,请参阅 Functions。 有关文本类型的详细信息,请参阅 文本。
默认情况下,编译器不会对未使用的绑定发出诊断。 若要接收这些消息,请在项目文件或调用编译器时启用警告 1182(请参阅--warnon
编译器选项下)。
为什么不可变?
不可变值是在整个程序执行过程中无法更改的值。 如果使用 C++、Visual Basic 或 C# 等语言,则可能发现 F# 将优先于不可变值而不是在程序执行过程中可以分配新值的变量置于意外状态。 不可变数据是函数编程的重要元素。 在多线程环境中,许多不同线程可以更改的共享可变变量难以管理。 此外,使用可变变量时,有时很难判断变量在传递给另一个函数时是否可能更改。
在纯函数语言中,没有变量,函数的行为严格地作为数学函数。 如果过程语言中的代码使用变量赋值来更改值,则函数语言中的等效代码具有不可变值,即输入、不可变函数和不同的不可变值作为输出。 这种数学严格性允许对程序的行为进行更严格的推理。 这种更严格的推理使编译器能够更严格地检查代码并更有效地优化代码,并帮助开发人员更轻松地理解和编写正确的代码。 因此,与普通过程代码相比,功能代码可能更易于调试。
F# 不是纯函数语言,但它完全支持函数编程。 使用不可变值是一个很好的做法,因为这样做可使代码从函数编程的一个重要方面中获益。
可变变量
可以使用关键字 mutable
指定可更改的变量。 F# 中的可变变量通常应具有有限的范围,可以是类型字段,也可以是本地值。 具有有限范围的可变变量更易于控制,并且不太可能以不正确的方式修改。
可以使用关键字将初始值分配给可变变量 let
,其方式与定义值的方式相同。 但是,区别在于,可以使用运算符将新值分配给可变变量 <-
,如以下示例所示。
let mutable x = 1
x <- x + 1
如果关闭捕获标记mutable
的值(包括创建关闭的窗体(例如seq
生成器)捕获,则标记的值可能会自动提升'a ref
到该窗体。 如果希望在发生这种情况时收到通知,请在项目文件或调用编译器时启用警告 3180。
相关主题
标题 | DESCRIPTION |
---|---|
let Bindings | 提供有关使用 let 关键字将名称绑定到值和函数的信息。 |
函数 | 概述 F# 中的函数。 |