演练:您的首个 F# 程序
Visual Studio 2010 包含一种新的编程语言,它就是 F#。 F# 是一种多范例语言,它除了支持传统的面向对象的编程和 .NET 概念外,还支持函数编程。 下面的示例介绍了它的一些功能和语法。 该示例演示如何声明简单变量,编写和测试函数,创建元组和列表,以及定义和使用类。
备注
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。
创建新的控制台应用程序
在**“文件”菜单上指向“新建”,再单击“项目”**。
如果您在**“模板类别”窗格中看不到 Visual F#,请单击“其他语言”,然后单击“Visual F#”。 中央的“模板”**窗格将列出 F# 模板。
查看**“模板”窗格的顶部,确保“.NET Framework 4”显示在“目标框架”**框中。
在模板列表中,单击**“F# 应用程序”**。
在**“名称”**字段中键入项目的名称。
单击**“确定”**。
新项目出现在**“解决方案资源管理器”**中。
使用 let 关键字声明和使用标识符
将以下代码复制并粘贴到**“Program.fs”**中。 您要将每个标识符(anInt、aString 和 anIntSquared)绑定到一个值。
let anInt = 5 let aString = "Hello" // Perform a simple calculation and bind anIntSquared to the result. let anIntSquared = anInt * anInt
备注
如果您无法在经典视图中看到代码,请确保将主题标题下的标头中的“语言筛选器”设置为包括 F#。
在 F# Interactive 窗口中查看结果
选择前面过程中的 let 表达式。
右击所选区域,然后单击**“发送到 Interactive”**。 另外,也可以按 Alt+Enter。
**“F# Interactive”**窗口将打开,并显示解释 let 表达式的结果,如下列代码行所示。 类型是从指定的值推断的。
val anInt : int = 5
val aString : string = "Hello"
val anIntSquared : int = 25
在命令提示窗口中查看结果
将下列代码行添加到**“Program.fs”**中。
System.Console.WriteLine(anInt) System.Console.WriteLine(aString) System.Console.WriteLine(anIntSquared)
按 Ctrl+F5 运行代码。 将显示命令提示窗口,其中包含下列值。
5
Hello
25
可以通过将鼠标指针停留在前面 WriteLine 语句中的标识符名称 anInt、aString 和 anIntSquared 上,验证推断的类型。
定义并运行函数
使用 let 表达式定义一个求平方函数,如下面的代码所示。 该函数有一个形参 n,并返回发送到 n 的实参的平方。
let square n = n * n // Call the function to calculate the square of anInt, which has the value 5. let result = square anInt // Display the result. System.Console.WriteLine(result)
按 Ctrl+F5 运行代码。 显示的结果为 25。
递归函数需要 let rec 表达式。 下面的示例定义了计算参数 n 的阶乘的函数。
let rec factorial n = if n = 0 then 1 else n * factorial (n - 1) System.Console.WriteLine(factorial anInt)
按 Ctrl+F5 运行该函数。 显示的结果为 120,即 5 的阶乘。
创建集合:列表和元组
聚合值的一种方法是使用元组,如下面的代码所示。
let turnChoices = ("right", "left") System.Console.WriteLine(turnChoices) // Output: (right, left) let intAndSquare = (anInt, square anInt) System.Console.WriteLine(intAndSquare) // Output: (5,25)
聚合值的另一种方法是使用列表,如下面的代码所示。
// List of best friends. let bffs = [ "Susan"; "Kerry"; "Linda"; "Maria" ]
通过使用“cons”运算符 (::),将新的好友添加到列表中。 请注意,该操作不更改 bffs 的值。 bffs 的值不可变,因此无法更改。
// Bind newBffs to a new list that has "Katie" as its first element. let newBffs = "Katie" :: bffs
使用 printfn 显示列表。 函数 printfn 显示结构化值中包含的各个元素。
printfn "%A" bffs // Output: ["Susan"; "Kerry"; "Linda"; "Maria"] printfn "%A" newBffs // Output: ["Katie"; "Susan"; "Kerry"; "Linda"; "Maria"]
可以通过按 Ctrl+F5 或选择一段代码再按 Alt+Enter,查看结果。
创建和使用类
下面的代码创建 Person 类,该类具有两个属性 Name 和 Age。 Name 为只读属性。 像函数编程中的大多数值一样,该属性的值不可变。 如果需要,可以在 F# 中创建可变值,但是您必须显式将其定义为可变。 在下面的类定义中,Age 的值存储在可变局部变量 internalAge 中。 可以更改 internalAge 的值。
// The declaration creates a constructor that takes two values, name and age. type Person(name:string, age:int) = // A Person object's age can be changed. The mutable keyword in the // declaration makes that possible. let mutable internalAge = age // Declare a second constructor that takes only one argument, a name. // This constructor calls the constructor that requires two arguments, // sending 0 as the value for age. new(name:string) = Person(name, 0) // A read-only property. member this.Name = name // A read/write property. member this.Age with get() = internalAge and set(value) = internalAge <- value // Instance methods. // Increment the person's age. member this.HasABirthday () = internalAge <- internalAge + 1 // Check current age against some threshold. member this.IsOfAge targetAge = internalAge >= targetAge // Display the person's name and age. override this.ToString () = "Name: " + name + "\n" + "Age: " + (string)internalAge
若要测试该类,请声明两个 Person 对象,进行一些更改,并显示结果,如下面的代码所示。
// The following let expressions are not part of the Person class. Make sure // they begin at the left margin. let person1 = Person("John", 43) let person2 = Person("Mary") // Send a new value for Mary's mutable property, Age. person2.Age <- 15 // Add a year to John's age. person1.HasABirthday() // Display results. System.Console.WriteLine(person1.ToString()) System.Console.WriteLine(person2.ToString()) // Is Mary old enough to vote? System.Console.WriteLine(person2.IsOfAge(18))
将显示以下行。
Name: John
Age: 44
Name: Mary
Age: 15
False
查看 F# 教程中的其他示例
在**“文件”菜单上指向“新建”,再单击“项目”**。
如果您在**“模板类别”窗格中看不到 Visual F#,请单击“其他语言”,然后单击“Visual F#”。 中央的“模板”**窗格将列出 F# 模板。
查看**“模板”窗格的顶部,确保“.NET Framework 4”显示在“目标框架”**框中。
在模板列表中,单击**“F# 教程”**。
单击**“确定”**。
该教程将显示在**“解决方案资源管理器”**中。
后续步骤
有关函数编程和附加示例的更多信息,请参见作为一类值的函数 (F#)。 有关元组、列表、let 表达式、函数定义、类、成员和许多其他主题的更多信息,请参见 F# 语言参考。