作者选择了自由软件基金会作为 写给捐款计划的一部分接受捐款。
介绍
F# 是一个开源编程语言,最初由微软研究公司开发,以扩展 .NET,微软的工具,库和语言组合来构建应用程序和服务。
采用特定的 paradigm 或代码风格,决定了我们如何思考和组织我们的编程问题解决方式。采用 _imperative 方法,使用的设计模型在语言如 C++或 Java中,开发人员逐步描述计算机如何完成任务。 它是写出一系列声明,在程序执行时会改变内存状态。 这很好,直到我们遇到一些不规则的情况。 例如,考虑到一个 _shared 对象,该对象由多个应用程序同时使用。 我们可能希望在另一个组件正在修改它时同时读取它的值。 这些是 concurrent 行动在一个内存位置上,可以产生数据不一致性和未定义的行为。
在 functional code design中,我们通过最大限度地减少可变状态的使用来预防此类问题,或者在我们创建它们后可以改变的状态。 函数是这里的关键词,指一些作为论点提供的信息的数学转换。 函数代码通过将解决方案构成一组要执行的函数来表达什么。
F# 的功能编程带来了一些好处:
- 更易于阅读和表达的语法,可提高程序的可维护性。
- 由于无状态函数而更容易破坏和更容易调试的代码,可用于测试。
- 可促进非同步编程和更安全的兼并的原生构件。
- 访问.NET 世界中的所有现有工具,包括社区共享的包。
选择一个 Runtime
由于F# 是跨平台的,所以通过不同的操作系统保持类似的执行模型行为至关重要。.NET 通过运行时间实现了这一点。
实际上,在 Linux 上有两种.NET 运行时实现: .NET Core和 Mono。 历史上,.NET 只在 Windows 上工作. 当时,人们可以使用社区 Mono 项目在 Linux 和 macOS 等其他平台上运行.NET 应用程序。
在本教程发布时,它们可以用于构建Web应用程序或命令行实用程序,也就是说,.NET Core 不会发送模型来在 Linux 和 macOS 上创建 GUI 桌面应用程序,而 Mono 是唯一支持移动和游戏平台的模型。
在本教程中,您将使用.NET Core 和 Mono 运行时间在 Ubuntu 18.04 上设置 F# 编程环境,然后写一些代码示例来测试和审查构建和编译方法。
前提条件
要完成本教程,您将需要对命令行和运行Ubuntu 18.04(http://releases.ubuntu.com/18.04)的计算机的基本熟悉性,并具有具有sudo特权的非根用户(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-18-04# step-2-%E2%80%94-creating-a-new-user)。
步骤 1 — 使用.NET Core 安装 F#
Microsoft 為 F# 開發人員提供 .NET Core Software Development Kit (SDK) 。 軟體開發套件是一套程式工具,允許程序員生產專用應用程式,並將其適應到各種作業系統。 它傳統上包括文本編輯器、語言支援、執行時間和編譯器,以及其他組件。 在此步驟中,您將安裝此 SDK。
您将在命令行上完成安装和设置,这是与计算机交互的非图形方式. 也就是说,而不是点击按钮,您将键入文本并通过文本从您的计算机获得反馈。
命令行,也被称为 shell 或 terminal,可以帮助修改和自动化您每天在计算机上执行的许多任务,并且是软件开发人员必不可少的工具。
在Ubuntu 18.04,你可以通过点击屏幕的左上角的Ubuntu图标来找到终端应用程序,然后在搜索栏中键入终端
。
打开终端后,使用wget
命令下载包含一些所需文件、Microsoft 存储库配置和服务器通信密钥的包。
1wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
现在,添加 Microsoft 存储库并使用dpkg -i
指令将包安装到您的系统。
1sudo dpkg -i packages-microsoft-prod.deb
接下来,激活 Universe 存储库,这是一个免费和开源的社区维护的软件存储库,这将为您提供apt-transport-https
的访问权限,这是一种允许 Ubuntu 包管理器 APT 通过 HTTPS 传输的依赖。
1sudo add-apt-repository universe
2sudo apt install apt-transport-https
接下来,更新可用的下载:
1sudo apt update
最后,安装.NET SDK 的 当前版本。
1sudo apt install dotnet-sdk-2.2
现在你已经安装了.NET SDK,可以快速检查一切是否顺利的是尝试.NET Core 命令行接口 (CLI),一旦 SDK 下载和安装,它将在壳中可用。
1dotnet --info
当您首次运行dotnet
命令时,如下所示,会显示一个文本部分:
1[secondary_label Output]
2Welcome to .NET Core!
3---------------------
4Learn more about .NET Core: https://aka.ms/dotnet-docs
5Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
6
7Telemetry
8---------
9The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
10
11Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
12...
此通知涉及收集的数据,并解释了一些.NET CLI 命令将向 Microsoft 发送使用信息. 您将在一瞬间禁用此功能;目前,请查看dotnet --info
的输出。
过了一会儿,终端会列出有关您的.NET 安装的信息:
1[secondary_label Output]
2.NET Core SDK (reflecting any global.json):
3 Version: 2.2.101
4 Commit: 236713b0b7
5
6Runtime Environment:
7 OS Name: ubuntu
8 OS Version: 18.04
9 OS Platform: Linux
10 RID: ubuntu.18.04-x64
11 Base Path: /usr/share/dotnet/sdk/2.2.101/
12
13Host (useful for support):
14 Version: 2.2.0
15 Commit: 1249f08fed
16
17.NET Core SDKs installed:
18 2.2.101 [/usr/share/dotnet/sdk]
19
20.NET Core runtimes installed:
21 Microsoft.AspNetCore.All 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
22 Microsoft.AspNetCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
23 Microsoft.NETCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
24
25To install additional .NET Core runtimes or SDKs:
26 https://aka.ms/dotnet-download
取决于 SDK 版本,输出可能略有不同,但这证实.NET Core 已准备好使用。
如前所述,远程测量功能允许某些.NET CLI 命令向 Microsoft 发送使用信息. 它默认启用,并可以通过将DOTNET\_CLI\_TELEMETRY_OPTOUT
环境变量设置为1
来禁用。
1nano ~/.profile
将下列行添加到.profile
的末尾:
1[label ~/.profile]
2. . .
3export DOTNET_CLI_TELEMETRY_OPTOUT=1
输出nano
按CTRL
和X
键,当被要求保存文件时,按Y
,然后按ENTER
。
您可以使用源
命令激活新配置:
1source ~/.profile
从现在开始,远程测量将被关闭在启动。
在此时,您已安装了.NET Core 运行时间、语言支持和库,允许您运行和构建某些.NET 应用程序。dotnet
CLI 也可用于管理.NET 源代码和二进制。
为了解决这个问题,在下一步,您将重新安装F# ,但这次使用Mono。
步骤 2 — 使用 Mono 安装 F#
您可以使用 Mono 来填补.NET Core 所剩余的能力差距. Mono 和.NET Core 都是基于相同的标准库,并且都支持.NET 语言,但这就是相似性结束的地方。
一个版本的Mono在Ubuntu存储库中可用,但这可能已经过时了。 相反,请将官方的Mono包存储库添加到您的包管理器:
1sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
2echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
在之前的命令中,您使用apt-key
来获取从官方Mono存储库转移的安全包的密钥,然后将Mono包源添加到您的存储库列表中。
添加了新的 APT 源列表,更新您的存储库:
1sudo apt update
接下来,下载 Mono 工具. 与.NET Core 不同, Mono 不包含 F# 工具,所以您将将其下载为单独的包。
1sudo apt install mono-complete fsharp
<$>[注] 注: 由于此下载的大小,安装过程可能需要一段时间。
一旦完成,你将有编译器fsharpc
和一个名为fsharpi
或简单地FSI的交互式壳。FSI是一个环境,壳内,它接收用户的输入作为一个表达式,评估它,然后输出结果,等待另一个输入。
使用以下命令激活 FSI:
1fsharpi
这将启动交互式会话,并用fsharpi
提示取代您的常规提示:
1[secondary_label Output]
2Microsoft (R) F# Interactive version 4.1
3Copyright (c) Microsoft Corporation. All Rights Reserved.
4
5For help type #help;;
6
7>
您可以通过运行# quit;
返回默认壳,在fsharpi
中,每个命令行都以双半字符结束。
让我们尝试使用printfn
函数进行一个简单的操作,以使作为参数传递的消息:
1printfn "Hello World!";;
您将获得以下输出:
1[secondary_label Output]
2Hello World!
3val it : unit = ()
4
5>
从之前的交互中, fsharpi
将表达式评估为 unity
类型值,然后执行代码,并以其类型打印结果。
fsharpi
也可以运行包含 F# 代码的文件. 该脚本必须以 .fsx
扩展命名,并从壳中执行命令:
1fsharpi some_script.fsx
现在你知道 F# 安装工作了,请将壳留下:
1> #quit;;
有了安装的 Mono 和.NET Core,您现在已经准备好编写任何类型的 F# 程序。 FSI 将允许您测试您的代码并在需要时运行一些脚本,但执行将是缓慢的。
步骤 3 – 使用.NET Core 编写和编译 F# 程序
在此步骤中,您将通过带有.NET Core 的命令行编译器编译 F# 源代码,从而使您的应用程序更快,并为特定系统生产预设可执行的包,从而使您的程序更容易分发。
Compiling 是将源代码转换为二进制文件的转换过程. 实现此转换的软件称为编译器..NET Core 依赖dotnet
CLI 来执行编译。
该dotnet
CLI 提供了完整的应用程序构建工具链. 一般来说,一个命令和一个dotnet
驱动程序的关联在壳中用于完成一个任务。
dotnet new
将创建一个 projectdotnet build
将创建一个项目,其所有依赖性dotnet add package
将添加一个包引用到项目文件
接下来将创建一个名为FSharpHello
的新控制台项目. -lang
选项将设置您将使用的编程语言,而 -o
选项将创建一个目录,以便将输出放置在其中。
1dotnet new console -lang F# -o FSharpHello
一旦完成,导航到您新创建的项目目录:
1cd FSharpHello
该目录包含了FSharpHello.fsproj
项目配置文件和用于存储临时对象文件的obj
文件夹。还有你的默认源代码存在的Program.fs
文件。
1nano Program.fs
该文件已自动填写一个 Hello World 程序:
1[label Program.fs]
2// Learn more about F# at http://fsharp.org
3
4open System
5
6[<EntryPoint>]
7let main argv =
8 printfn "Hello World from F#!"
9 0 // return an integer exit code
在此代码中,您开始导入系统
模块打开系统
,然后定义程序的输入点,即从壳开始程序的位置。
离开文件。
要编译和运行此代码,请从项目目录中使用以下内容 ~/FSharpHello
:
1dotnet run
该程序将运行,在屏幕上打印以下输出:
1[secondary_label Output]
2Hello World from F#!
请注意,这个程序运行需要一段时间,就像FSI一样. 正如我们之前提到的,通过生成可执行的,即可以直接由操作系统运行的二进制文件来运行这个更快。
1dotnet publish -c release -r linux-x64
这会产生可执行的 bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll
文件. 这是一个在 64 位 Linux 架构上运行的共享库。 为了向 macOS 系统导出通用可执行的文件,你会用 osx-x64
代替 linux-x64
运行时间标识符(RID)。
现在用以下命令执行文件:
1dotnet bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll
这一次,您将更快地收到输出,因为该程序已经被翻译成二进制。
现在你已经知道如何在.NET Core 中编译,让我们看看 Mono 如何用专用的fsharpc
命令编译程序。
步骤 4 – 使用 Mono 编写和编译 F# 程序
Mono 的编译过程类似于.NET Core 的编译过程,但这次有一个特定的命令用于编译该程序。
这一次,创建一个hello.fs
文件,然后写一些F# 代码。
1cd
接下来,打开一个名为hello.fs
的新文件:
1nano hello.fs
将以下行添加到文件中:
1[label hello.fs]
2open System
如前所述,这将导入系统
模块或名称空间,让您可以访问内置的系统功能和对象,如控制台
。
现在,添加一些更多的代码行:
1[label hello.fs]
2open System
3
4let hello() =
5 printf "Who are you? "
6 let name = Console.ReadLine()
7 printfn "Oh, Hello %s!\nI'm F#." name
这些新行定义了hello()
函数,用于阅读用户输入并打印反馈消息。
现在你可以添加最后的行:
1[label hello.fs]
2open System
3
4let hello() =
5 printf "Who are you? "
6 let name = Console.ReadLine()
7 printfn "Oh, Hello %s!\nI'm F#." name
8
9hello()
10Console.ReadKey() |> ignore
在这里,您正在调用函数 hello()
,然后使用 ReadKey()
方法以最后按键结束程序。
保存和退出文件。
现在用fsharpc
命令,使用-o
旗定义输出文件名,并编译您的hello.fs
源代码如下:
1fsharpc hello.fs -o hello
上面的命令会生成一个Hello
可执行的文件,您可以使用mono
命令运行:
1mono hello
这为您提供以下输出,并等待用户输入:
1[secondary_label Output]
2Who are you?
如果你输入Sammy
,你会得到以下内容。
1[secondary_label Output]
2Oh, Hello Sammy!
3I'm F#.
按下最后一个键,然后程序将结束。
恭喜您!您已经编写并编译了您的第一个 F# 程序,使用 Mono 和.NET Core。
结论
在本教程中,您安装了用于 F# 编程的工具,涵盖了.NET Core 和 Mono 环境,您还测试了 F# 代码的示例和构建的执行。