Visual Studio Code 中的 F# 入门

您可以使用 Ionide 插件在 Visual Studio Code 中编写 F#,以获得强大的跨平台轻型集成开发环境(IDE)体验,并享受 IntelliSense 和代码重构功能。 请访问 Ionide.io 了解有关插件的详细信息。

注意

在开始之前,请确保已安装 F# 和 Ionide 插件

使用 Ionide 创建第一个项目

若要创建新的 F# 项目,请打开命令行并使用 .NET CLI 创建新项目:

dotnet new console -lang "F#" -o FirstIonideProject

完成后,切换到项目目录并打开 Visual Studio Code。

cd FirstIonideProject
code .

在 Visual Studio Code 中加载项目后,应会看到窗口左侧的 F# 解决方案资源管理器窗格打开。 这意味着 Ionide 已成功加载刚刚创建的项目。 你可以在此时间点之前在编辑器中编写代码,但发生此情况后,所有内容都已完成加载。

编写第一个脚本

将 Visual Studio Code 配置为使用 .NET Core 脚本后,导航到 Visual Studio Code 中的资源管理器视图并创建新文件。 将其命名 MyFirstScript.fsx

现在,将以下代码添加到其中:

let toPigLatin (word: string) =
    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' | 'o' | 'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"

此函数将单词转换为 Pig Latin形式。 下一步是使用 F# Interactive (FSI) 对其进行评估。

突出显示整个函数(长度应为 11 行)。 突出显示后,按住 Alt 键并点击 Enter。 你会注意到屏幕底部弹出一个终端窗口,它应如下所示:

使用 Ionide 的 F# 交互式输出示例

这做了三件事:

  1. 启动了 FSI 进程。
  2. 它已将突出显示的代码发送到 FSI 进程。
  3. FSI 进程评估了你发送的代码。

由于所发送的内容是 函数,因此现在可以使用 FSI 调用该函数! 在交互式窗口中,键入以下内容:

toPigLatin "banana";;

应会看到以下结果:

val it: string = "ananabay"

现在,让我们尝试一个元音作为第一个字母。 输入以下内容:

toPigLatin "apple";;

应会看到以下结果:

val it: string = "appleyay"

该函数似乎按预期工作。 恭喜,你刚刚在 Visual Studio Code 中编写了第一个 F# 函数,并使用 FSI 对其进行了评估!

注意

正如你可能已注意到的,FSI 中的行以 ;; 终止。 这是因为 FSI 允许输入多行。 末尾的 ;; 让 FSI 知道代码何时完成。

说明代码

如果不确定代码实际在做什么,以下是分步骤说明。

正如你所看到的,toPigLatin 是一个函数,它采用单词作为其输入,并将其转换为该单词的 Pig-Latin 表示形式。 此规则如下所示:

如果单词中的第一个字符以元音开头,请在单词末尾添加“yay”。 如果它不以元音开头,请将第一个字符移动到单词末尾,并向其添加“ay”。

你可能在 FSI 中注意到了以下内容:

val toPigLatin: word: string -> string

这表示,toPigLatin 是一个函数,它采用 string 作为输入(称为 word),并返回另一个 string。 这称为函数的 类型签名,这是了解 F# 代码的关键部分。 如果将鼠标悬停在 Visual Studio Code 中的函数上,你也会注意到这一点。

在函数正文中,你将注意到两个不同的部分:

  1. 一个名为 isVowel 的内部函数,通过模式匹配检查给定字符 (c) 是否与提供的模式之一匹配,从而可确定该字符是否为元音:

    let isVowel (c: char) =
        match c with
        | 'a' | 'e' | 'i' | 'o' | 'u'
        | 'A' | 'E' | 'I' | 'O' | 'U' -> true
        |_ -> false
    
  2. 一个 if..then..else 表达式,用于检查第一个字符是否为元音,并基于第一个字符是否为元音从输入字符构造返回值:

    if isVowel word[0] then
        word + "yay"
    else
        word[1..] + string(word[0]) + "ay"
    

因此,toPigLatin 的流程如下:

检查输入词的第一个字符是否为元音。 如果是,将“yay”附加到单词的末尾。 否则,请将该第一个字符移到单词末尾,并向其添加“ay”。

关于此方面最后要注意的一点是:在 F# 中,没有从函数返回的显式指令。 这是因为 F# 是基于表达式的,在函数正文中计算的最后一个表达式决定了该函数的返回值。 由于 if..then..else 本身是表达式,因此计算 then 块的主体或 else 块的主体决定了 toPigLatin 函数返回的值。

将控制台应用转换为隐语生成器

本文前面的部分演示了编写 F# 代码的常见第一步:编写初始函数并使用 FSI 以交互方式执行该函数。 这称为 REPL 驱动的开发,其中,REPL 表示“读取-求值-打印循环”。 在你具有可实际工作的内容之前,这是一种非常好的方式来体验功能。

REPL 驱动开发中的下一步是将工作代码移动到 F# 实现文件中。 然后,F# 编译器可以将它编译为可执行的程序集。

首先,打开之前使用 .NET CLI 创建的 Program.fs 文件。 你会注意到,其中已存在某些代码。

接下来,创建名为 PigLatin 的新 module,并将前面创建的 toPigLatin 函数复制到其中:

module PigLatin =
    let toPigLatin (word: string) =
        let isVowel (c: char) =
            match c with
            | 'a' | 'e' | 'i' | 'o' | 'u'
            | 'A' | 'E' | 'I' | 'O' | 'U' -> true
            |_ -> false
        
        if isVowel word[0] then
            word + "yay"
        else
            word[1..] + string word[0] + "ay"

此模块应高于 main 函数,并且位于 open System 声明下方。 声明顺序在 F# 中很重要,因此在文件中调用函数之前,需要定义函数。

现在,在 main 函数中,对参数调用隐语生成器函数:

[<EntryPoint>]
let main args =
    for arg in args do
        let newArg = PigLatin.toPigLatin arg
        printfn "%s in Pig Latin is: %s" arg newArg

    0

现在,可以从命令行运行控制台应用:

dotnet run apple banana

你将看到它输出的结果与脚本文件相同,但这次是正在运行的程序!

Ionide 故障排除

可通过以下几种方法排查可能遇到的某些问题:

  1. 若要获取 Ionide 的代码编辑功能,需要将 F# 文件保存到磁盘和 Visual Studio Code 工作区中打开的文件夹内。
  2. 如果已在打开 Visual Studio Code 的情况下更改系统或安装了 Ionide 先决条件,请重启 Visual Studio Code。
  3. 如果项目目录中的字符无效,Ionide 可能无法正常工作。 如果是这种情况,请重命名项目目录。
  4. 如果所有 Ionide 命令都不起作用,请检查 Visual Studio Code 键绑定,以查看是否意外地替代了它们。
  5. 如果 Ionide 在您的计算机上无法正常工作,并且上述任何解决方案都无法解决问题,请尝试删除计算机上的 ionide-fsharp 目录并重新安装插件套件。
  6. 如果项目加载失败(F# 解决方案资源管理器将显示此内容),请右键单击该项目,然后单击 查看详细信息 以获取更多诊断信息。

Ionide 是由 F# 社区的成员构建和维护的开源项目。 请在 ionide-vscode-fsharp GitHub 存储库中报告问题并随意参与。

还可以在 Ionide Gitter 频道中向 Ionide 开发人员和 F# 社区寻求进一步帮助。

后续步骤

若要了解有关 F# 和语言功能的详细信息,请查看 F#教程。