Visual Studio for Mac 中的 F# 入门
重要
Microsoft 已宣布停用 Visual Studio for Mac。 从 2024 年 8 月 31 日起,将不再支持 Visual Studio for Mac。 替代方案包括:
- 带有 C# 开发工具包 和相关扩展(如 .NET MAUI 和 Unity)的 Visual Studio Code。
- 在 Mac 虚拟机中的 Windows 上运行的 Visual Studio。
- 在云虚拟机中的 Windows 上运行的 Visual Studio。
有关详细信息,请参阅 Visual Studio for Mac 停用公告。
Visual Studio for Mac IDE 支持 F#。 确保已安装 Visual Studio for Mac。
创建控制台应用程序
Visual Studio for Mac 中最基本的项目之一是控制台应用程序。 下面介绍如何执行该操作。 打开 Visual Studio for Mac 后:
在“文件”菜单上指向“新建解决方案”。
在“新建项目”对话框中,控制台应用程序有两个不同的模板。 在“其他”->“.NET”下有一个面向 .NET Framework 的模板。 在“.NET Core”->“应用”下有另一个面向 .NET Core 的模板。 两种模板都适用于实现本文的目的。
如果需要,请在控制台应用下将 C# 改为 F#。 选择“下一步”按钮以继续!
为项目命名,并为应用选择所需的选项。 请注意,屏幕右侧的预览窗格将显示会根据所选选项创建的目录结构。
单击“创建”。 现在应该会在解决方案资源管理器中看到 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# 指南中,还包含一些可供使用的良好外部资源。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈