演练:您的首个 F# 程序

Visual Studio 2010 包含一种新的编程语言,它就是 F#。 F# 是一种多范例语言,它除了支持传统的面向对象的编程和 .NET 概念外,还支持函数编程。 下面的示例介绍了它的一些功能和语法。 该示例演示如何声明简单变量,编写和测试函数,创建元组和列表,以及定义和使用类。

备注

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

创建新的控制台应用程序

  1. 在**“文件”菜单上指向“新建”,再单击“项目”**。

  2. 如果您在**“模板类别”窗格中看不到 Visual F#,请单击“其他语言”,然后单击“Visual F#”。 中央的“模板”**窗格将列出 F# 模板。

  3. 查看**“模板”窗格的顶部,确保“.NET Framework 4”显示在“目标框架”**框中。

  4. 在模板列表中,单击**“F# 应用程序”**。

  5. 在**“名称”**字段中键入项目的名称。

  6. 单击**“确定”**。

    新项目出现在**“解决方案资源管理器”**中。

使用 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 窗口中查看结果

  1. 选择前面过程中的 let 表达式。

  2. 右击所选区域,然后单击**“发送到 Interactive”**。 另外,也可以按 Alt+Enter。

  3. **“F# Interactive”**窗口将打开,并显示解释 let 表达式的结果,如下列代码行所示。 类型是从指定的值推断的。

    val anInt : int = 5

    val aString : string = "Hello"

    val anIntSquared : int = 25

在命令提示窗口中查看结果

  1. 将下列代码行添加到**“Program.fs”**中。

    System.Console.WriteLine(anInt)
    System.Console.WriteLine(aString)
    System.Console.WriteLine(anIntSquared)
    
  2. 按 Ctrl+F5 运行代码。 将显示命令提示窗口,其中包含下列值。

    5

    Hello

    25

    可以通过将鼠标指针停留在前面 WriteLine 语句中的标识符名称 anInt、aString 和 anIntSquared 上,验证推断的类型。

定义并运行函数

  1. 使用 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)
    
  2. 按 Ctrl+F5 运行代码。 显示的结果为 25。

  3. 递归函数需要 let rec 表达式。 下面的示例定义了计算参数 n 的阶乘的函数。

    let rec factorial n = 
        if n = 0 
        then 1 
        else n * factorial (n - 1)
    System.Console.WriteLine(factorial anInt)
    
  4. 按 Ctrl+F5 运行该函数。 显示的结果为 120,即 5 的阶乘。

创建集合:列表和元组

  1. 聚合值的一种方法是使用元组,如下面的代码所示。

    let turnChoices = ("right", "left")
    System.Console.WriteLine(turnChoices)
    // Output: (right, left)
    
    let intAndSquare = (anInt, square anInt)
    System.Console.WriteLine(intAndSquare)
    // Output: (5,25)
    
  2. 聚合值的另一种方法是使用列表,如下面的代码所示。

    // 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"]
    
  3. 可以通过按 Ctrl+F5 或选择一段代码再按 Alt+Enter,查看结果。

创建和使用类

  1. 下面的代码创建 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
    
    
  2. 若要测试该类,请声明两个 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# 教程中的其他示例

  1. 在**“文件”菜单上指向“新建”,再单击“项目”**。

  2. 如果您在**“模板类别”窗格中看不到 Visual F#,请单击“其他语言”,然后单击“Visual F#”。 中央的“模板”**窗格将列出 F# 模板。

  3. 查看**“模板”窗格的顶部,确保“.NET Framework 4”显示在“目标框架”**框中。

  4. 在模板列表中,单击**“F# 教程”**。

  5. 单击**“确定”**。

  6. 该教程将显示在**“解决方案资源管理器”**中。

后续步骤

有关函数编程和附加示例的更多信息,请参见作为一类值的函数 (F#)。 有关元组、列表、let 表达式、函数定义、类、成员和许多其他主题的更多信息,请参见 F# 语言参考

请参见

概念

作为一类值的函数 (F#)

其他资源

Visual F#

F# 语言参考