Visual Studio for Mac 中的 F# 入门

重要

Microsoft 已宣布停用 Visual Studio for Mac。 从 2024 年 8 月 31 日起,将不再支持 Visual Studio for Mac。 替代方案包括:

有关详细信息,请参阅 Visual Studio for Mac 停用公告

Visual Studio for Mac IDE 支持 F#。 确保已安装 Visual Studio for Mac

创建控制台应用程序

Visual Studio for Mac 中最基本的项目之一是控制台应用程序。 下面介绍如何执行该操作。 打开 Visual Studio for Mac 后:

  1. 在“文件”菜单上指向“新建解决方案”。

  2. 在“新建项目”对话框中,控制台应用程序有两个不同的模板。 在“其他”->“.NET”下有一个面向 .NET Framework 的模板。 在“.NET Core”->“应用”下有另一个面向 .NET Core 的模板。 两种模板都适用于实现本文的目的。

  3. 如果需要,请在控制台应用下将 C# 改为 F#。 选择“下一步”按钮以继续!

  4. 为项目命名,并为应用选择所需的选项。 请注意,屏幕右侧的预览窗格将显示会根据所选选项创建的目录结构。

  5. 单击“创建”。 现在应该会在解决方案资源管理器中看到 F# 项目。

编写自己的代码

让我们从编写一些代码入手。 确保 Program.fs 文件已打开,然后将其内容替换为以下内容:

module HelloSquare

let square x = x * x

[<EntryPoint>]
let main argv =
    printfn "%d squared is: %d!" 12 (square 12)
    0 // Return an integer exit code

在上面的代码示例中已定义了一个函数 square,该函数采用一个名为 x 的输入,并将其与自身相乘。 因为 F# 使用类型推理,所以不需要指定 x 的类型。 F# 编译器了解可有效运用乘法的类型,并会根据 square 的调用方式将类型分配给 x。 如果将鼠标悬停在 square 上,应该会看到以下内容:

val square: x:int -> int

这就是所谓的函数类型签名。 可以这样理解:“Square 是一个函数,它采用一个名为 x 的整数并产生一个整数”。 请注意,编译器现在向 square 提供 int 类型,这是因为乘法在所有类型之间不是通用的,而是在一个封闭的类型集中通用。 F# 编译器此时选取 int,但是如果使用其他输入类型调用 square(例如 float),它会调整类型签名。

定义了另一个函数 main,该函数用 EntryPoint 属性修饰,此属性指示 F# 编译器,函数执行应从此处开始。 它遵循与其他 C 样式编程语言相同的约定,其中可以将命令行参数传递给该函数,并返回一个整数代码(通常为 0)。

在此函数中,我们使用 12 的参数调用 square 函数。 然后,F# 编译器将 square 的类型指定为 int -> int(即一个采用 int 并生成 int 的函数)。 对 printfn 的调用是格式化打印函数,该函数使用格式字符串(类似于 C 样式编程语言)以及与在格式字符串中指定的参数相对应的参数,然后打印出结果和新的一行。

运行代码

单击顶级菜单中的“运行”然后选择“开始执行(不调试)”,可以运行代码并查看结果。 这将在不调试的情况下运行程序,并能查看结果。

现在,应会看到以下内容打印至 Visual Studio for Mac 弹出的控制台窗口:

12 squared is 144!

祝贺你! 已在 Visual Studio for Mac 中创建了第一个 F# 项目,并编写了 F# 函数,该函数将打印调用该函数的结果,并运行该项目以查看一些结果。

使用 F# 交互窗口

Visual Studio for Mac 中的 F # 工具的最佳功能之一就是 F# 交互窗口窗口。 使用该功能,可将代码发送到可调用该代码并以交互方式查看结果的进程。

若要开始使用该功能,请选中代码中定义的 square 函数。 接下来,单击顶部菜单中的“编辑”。 然后选择“向 F# 交互窗口发送选定内容”。 该操作将在 F# 交互窗口中执行该代码。 也可以右键单击所选内容,然后选择“向 F# 交互窗口发送选定内容”。 此时应出现 F# 交互窗口,且其中显示以下内容:

>

val square: x: int -> int

>

这会显示 square 函数的相同函数签名,你之前将鼠标悬停在该函数上时看到过该签名。 由于 square 现在是在 F# 交互窗口进程中定义的,因此可以通过不同的值调用它:

> square 12;;
val it: int = 144
> square 13;;
val it: int = 169

这会执行函数,将结果绑定到新名称 it,并显示 it 的类型和值。 请注意,每行都必须以 ;; 结尾。 F# 交互窗口通过此方式了解函数调用的完成时间。 还可以在 F# 交互窗口中定义新函数:

> let isOdd x = x % 2 <> 0;;

val isOdd: x: int -> bool

> isOdd 12;;
val it: bool = false

上面定义了一个新函数 isOdd,该函数采用 int 并检查它是否为奇数! 可以调用此函数,查看该函数针对不同输入所返回的结果。 可以在函数调用中调用函数:

> isOdd (square 15);;
val it: bool = true

还可以使用管道-转发运算符通过管道将值传送至两个函数中:

> 15 |> square |> isOdd;;
val it: bool = true

后面的教程中介绍了管道-转发运算符以及更详细的内容。

此处只是简单了解一下 F# 交互窗口的功能。 若要了解详细信息,请参阅使用 F# 进行交互式编程

后续步骤

如果尚未执行此操作,请查看 F# 教程,其中介绍了 F# 的一些核心功能。 它概述了 F# 的部分功能,并提供可以复制到 Visual Studio for Mac 中并运行的大量代码示例。 在 F# 指南中,还包含一些可供使用的良好外部资源。

另请参阅