# 二、F# 的第一步

本章将重点介绍一些关于 F# 语言及其编程环境的一般介绍性细节。接下来的三章将集中在充实语言的细节，而这一章将只是提供一个可以做的尝试。所以不要担心，如果你不理解本章中看到的例子的所有细节，本书的其余部分会把它们填满。

## 获取并安装 F#

使用 F# 最简单快捷的方法是使用微软的 Visual Studio。F# 包含在 Visual Studio 2012 和 2010 中。如果没有 Visual Studio 的副本，可以从[http://www.microsoft.com/visualstudio/try](http://www.microsoft.com/visualstudio/try)下载 90 天免费试用版。

默认情况下，Visual Studio 2012 和 2010 都安装了 F#，所以只需安装带有默认选项的 Visual Studio 就足够了。如果您安装了 Visual Studio，但 F# 不可用，则可能是在安装 Visual Studio 时停用了 F#。要激活 F#，打开**控制面板**，进入**程序**菜单。

如果你不想在 Visual Studio 中使用 F# 的话，你可以在[http://www.microsoft.com/download/en/details.aspx?id=11100](http://www.microsoft.com/download/en/details.aspx?id=11100)从微软下载一个命令行编译器，用你喜欢的文本编辑器编辑 F# 源文件。因为我认为 Visual Studio 是初学者体验 F# 的最佳方式，所以本章的其余部分将假设您使用的是 Visual Studio，尽管所有示例都将与编译器的命令行版本一起工作。

## 你好世界

按照惯例，让我们从 F# 中的“hello world”节目开始。首先，我们需要创建一个 Visual Studio 项目来托管我们的程序。为此，导航至**文件** > **新建** > **项目……**并选择一个 **F# 应用**。

| ![](img/note.png) | 注意:F# 仅附带四个预安装的应用或库模板。然而，网上有更多的模板。这些在线模板由微软的 F# 团队和 F# 社区共同提供。它们可以通过 Visual Studio 的“新建项目”对话框进行搜索和安装。 |

删除 **program.fs** 文件中的内容，并输入以下行:

```fs
    System.Console.WriteLine "Hello World"

```

现在按 F5 编译并执行程序，您会看到控制台短暂弹出“Hello World”问候语。请注意程序只有一行长——这是 F# 哲学的一部分，代码应该尽可能不受语法混乱的影响，您会发现这是许多函数式编程语言共有的哲学。我们只是希望能够调用`System.Console.WriteLine`方法并传递给它一个字符串，所以这是我们需要的程序的仅有的两个元素。

因为程序在问候被写入控制台后直接退出，所以问候文本在屏幕上的时间可能太短，我们看不到。让我们通过从控制台读取一行来解决这个问题，以便程序在按下回车键之前不会退出:

```fs
    open System
    Console.WriteLine "Hello World"

    Console.ReadLine()

```

现在再次按下 F5 键。这次执行程序时，问候语会一直保留，直到您按回车键，程序退出。注意我们如何使用`open`关键字打开`System`命名空间。这允许我们从`Console`类名的开头移除`System`，编译器仍然能够找到该类，因为它现在将在`System`命名空间中寻找它。`open`关键字在用于导入名称空间时与 C#中的`using`关键字非常相似。

## 使用 F# 交互

Visual Studio 附带了一个名为 F# Interactive 的 F# 交互版本。这有时被称为读取-评估-打印循环，简称 REPL。它给了 F# 一种动态语言的感觉，因为程序员能够交互式地评估他或她的程序的各个部分，并立即看到结果，尽管应该注意的是，F# Interactive 动态编译您传递给它的代码部分，因此您应该看到与编译后的 F# 代码相似的性能水平。要使用 F# Interactive，只需突出显示要评估的代码部分，然后按 Alt+Enter。然后，您将在通常位于屏幕底部的 F# 交互式窗口中看到这段代码的打印结果。因此，如果我们突出显示最初的“hello world”程序并按 Alt+Enter，我们会看到以下结果:

你好世界

值:单位=()

第一行是输出到控制台的问候。第二个是关于程序类型的一些细节——暂时不要太担心这个。类型将在后面的章节中解释。

能够交互执行这样的代码是我最喜欢的 F# 特性之一。我认为能够快速尝试这样的想法是一种真正的生产力提升。所以让我们继续看看你可以用 F# Interactive 做的一些其他事情，比如创建交互式图表。

F# 团队已经为`System.Windows.​Forms.DataVisua​lization.Charti​ng.dll`创建了一个 F# 友好的包装。这个包装器的主要目的是让您能够快速地将程序中可用的数据(或 F# 交互会话)显示为图表。可从[http://code . msdn . Microsoft . com/windowsdesktop/fsharpchat-b 59073 F5](http://code.msdn.microsoft.com/windowsdesktop/FSharpChart-b59073f5)下载。

一旦你解压下载的 **FSharpChart** 文件夹，你会在 **F#** > **脚本**文件夹中找到 **FSharpChart.fsx** 文件。您需要确保该脚本与您正在使用的 F# 脚本在同一个目录中，或者相应地修改脚本的路径。

现在让我们看看如何使用 F# 图表。以下示例显示了如何创建显示简单直线的图表:

```fs
    #load "FSharpChart.fsx"

    open MSDN.FSharp.Charting

    let data = [ 1; 2; 3; 4 ]
    FSharpChart.Line data

```

将该程序输入 F# Interactive 后，再次通过 Alt+Enter，您将看到一个窗口弹出，如下图所示:

![](img/image002.jpg)

图 1:F #交互中的折线图

让我们来看看这个程序是如何工作的。第一行将图表脚本(一个名为`FSharpChart.fsx`的文件)加载到 F# 交互会话中。这一行可能需要几秒钟，因为图表脚本相当大，但您只需要加载一次，这些功能将继续在交互式会话中可用。下一行导入我们将要使用的图表函数的名称空间。下面一行创建一个整数列表，并将它们绑定到`data`标识符。最后，我们将我们的列表传递给制图功能`FSharpChart.Line`，它会绘制一个线形图。这不是世界上最令人兴奋的图表，让我们再看一张。

下面的代码示例将创建一个柱形图，显示日期和每个日期的值:

```fs
    #load "FSharpChart.fsx"

    open System
    open MSDN.FSharp.Charting

    let dateInApril day = new DateTime(2012, 03, day)

    let data = [ dateInApril 6, 4; dateInApril 7, 8;
                 dateInApril 8, 2; dateInApril 9, 3 ]
    FSharpChart.Column data

```

同样，在将这个程序输入到 F# Interactive 时，您会看到一个弹出窗口，显示如下图:

![](img/image003.jpg)

图 2:F #交互中的柱形图

程序的顶部，加载 **FSharpChart.fsx** 脚本和`open`语句的部分与之前基本相同。第一个主要区别是我们定义了一个函数`dateInApril`，提供了一种在 2012 年 4 月创建`DateTime`对象的简写方式。接下来，您会注意到我们的数据列表不是单个值，而是成对的值，称为*元组*。每对包含一个日期对象和一个整数。最后，我们将元组列表传递给绘制柱形图的制图功能`FSharpChart.` `Column`。虽然这个图表可能比上一个图表有趣一点，但这个例子并不太现实，因为我们更有可能绘制来自外部数据源(如文本文件)的数据。

让我们看看如何从. csv 文件中加载一些数据并用 F# 绘制图表:

```fs
    #load "FSharpChart.fsx"

    open System
    open System.IO
    open MSDN.FSharp.Charting

    let treatLine (line: string) =
        let stringParts = line.Split(';')
        DateTime.Parse stringParts.[0], int stringParts.[1]

    let data =
        File.ReadAllLines (__SOURCE_DIRECTORY__ + "\\mydata.txt") 
        |> Array.map treatLine

    FSharpChart.Column data

```

然而，程序的顶部变化不大。在`open`语句之后，我们定义了一个名为`treatLine`的函数，它将一行分成两部分，将第一部分解析为日期，将第二部分解析为整数。接下来我们使用。NET 的`File.ReadAllLines`函数从名为`mydata.txt`的文本文件中读取所有数据。之后，我们使用`Array.map`函数将文本文件中的每一行传递给我们的`treatLine`函数，并创建一个新的数组——这与在 C#中使用 LINQ 扩展方法`Select`非常相似。最后，我们将结果传递给`FSharpChart.Column`来绘制图形。

## 总结

这一章已经非常简要地介绍了使用 F# 来创建编译程序和使用 F# Interactive 来快速测试想法。本书的剩余部分将详细介绍 F# 语言的语法和特性，从而指导如何用 F #编程。