使用变量来存储值

已完成

所有程序通常由程序对数据进行操作的多个步骤组成。 在运行所有这些步骤的过程中,通常会将间歇性结果(即数据)存储在命名引用中。 你稍后可以读取或操作数据。 命名引用通常称为“变量”。

变量会绑定值

变量是绑定到你想要在代码中继续引用的值的命名引用。 在 F# 中,它被看作是绑定一个值。 因此,你要做的是将值分配(或绑定)到命名引用(也就是变量)。 若要绑定值,请使用 let 关键字(即引用名称)并为其赋值,如下面的代码中所示:

let name = "Chris"

name 是命名引用,“Chris”是它绑定的值。

为变量赋值后,变量是不可变的,不可更改它。 下面的代码不会进行编译,并产生类似“错误 FS0027: 此值不可变”的错误。

let name = "Chris"
name <- "Luis" // not allowed

使其可变

你可以更改变量,但需要发出你想要使其可变的信号。 通过在变量定义中使用 mutable 关键字,可在没有编译错误的情况下更改值,如以下代码中所示:

let mutable name = "Chris"
name <- "Luis" // this statement is now allowed

变量类型

F# 中存在不同类型的范围。 许多类型都与存储不同大小的数字和有无小数有关。 其他类型与文本字符串或布尔变量关联。 下面列出了开始学习 F# 时可能会遇到的类型。

类型 描述
bool 可能的值为 truefalse
int 值的范围是 -2,147,483,648 至 2,147,483,647。
string Unicode 文本
float、double 64 位浮点类型。

类型已推断

在声明变量时,可以使用类型,也可以不使用类型。 如果在声明变量时不提供类型,F# 编译器将根据赋给变量的值对应该为哪种类型做出最佳推断。 请考虑下列语句:

let age = 65 // int
let PI = 3.14 // float
let name = "my name" // string

编译器将推断应该为哪些类型,并且推断正确。 你还可以更明确地表示所需的类型。 若要指定数据,请使用语法 variableName:<type>,如以下代码中所示:

let sum:float = 0.0

你经常需要能够打印到屏幕。 这可能是出于各种原因,比如:

  • 应用程序输出:应用程序进行某种计算,你需要查看输出。
  • 调试:在调试代码的过程中,你可能需要在给定点输出结果以了解发生了什么问题。

需要输出到屏幕还有其他原因,但上述两种情况最为常见。

那么,如何打印到屏幕呢? 在 F# 中,可以使用三个不同的函数。 它们是 printfprintfn、甚至是 Console.WriteLine。 它们的区别是什么?

  • printf:它将打印到 stdout 内联(没有换行符)。
  • printfn:它将打印到 stdout(添加一个换行符)。
  • Console.WriteLine:此函数来自 System 命名空间,适用于所有 .NET 语言。

现在你了解了区别,但应该使用哪一种? 在 F# 中,printfprintfn 被认为更惯用,是首选的函数。

格式设置

在打印到屏幕的过程中,你可能需要组合文本和数字。 或者,你可能希望以特定方式设置输出的格式,例如通过使用:

  • 位置参数:要设置格式,可以使用 String.Format 这样的 .NET 函数,该函数使用位置参数(如 String.Format("My name is {0} and I live in {1}", "Chris", "UK"))。

  • 字符串内插:组合变量和文本的另一种方法是使用内插操作。 若要使用它,需要在字符串前面加上 $ 符号,并使用括号 {} 指示占位符。 下面是使用内插的示例:

    let name = "Luis"
    let company = "Microsoft"
    printfn $"Name: {name}, Company: {company}"
    

    还可以在括号之间添加表达式,如下所示:

    let firstNumber = 2000
    let secondNumber = 21
    printfn $"The year is: {firstNumber + secondNumber}"
    

    备注

    不使用内插进行类型检查,因此使用起来可能很简单。 请务必正确地进行组合。

  • 说明符:在尝试打印时,你还可以使用格式说明符。 使用说明符是在 F# 中设置格式的最常用方式。 下面是一个示例:

    let name = "Chris"
    printf "Hi %s" name
    // prints: Hi Chris
    

    在这里可以看到,如何使用格式化程序 %s 将第一个字符串与变量 name 混合使用。

    备注

    使用诸如 %s 或 %i 的格式化程序时,编译器将检查类型。 如果位置参数的类型不是指定的类型,则会引发错误。

格式说明符

有许多格式说明符。 下面是你可能会遇到的一些格式说明符。

说明符 说明 示例
%s 用于字符串和非转义内容 printf "Hello %s" name
%d、%i 格式已设置为十进制整数,如果基本整数类型有符号,则它有符号 printf "Age: %i" 65
%b 布尔值 truefalse printf "Setting on: %b" true

还有更多有关格式设置的信息。 如果要了解所有功能,请参阅在 F# 中设置格式的文档