第二章 获得、安装、使用 F#

第二章获得、安装、使用F#

 

这一章介绍如何获得F#,如何在Windows 和Linux 下安装,如何以不同的方法编译,我们也将讨论本书用于测试的例子的软件版本。

 

获得F#

 

F# 现在默认包含在 Visual Studio2010 中,因此,如果你已经安装了这个版本,可能就已经安装了 F#;如果你安装的是Visual Studio 2010,但是,却看不到 F#,那么,就要确认一下,是否已经安装了这个包。可以通过控制面板中的程序或添加、删除程序完成(如图 2-1)。

图 2-1 启用 Visual Studio 2010 中的 F#

 

如果你还不是 Visual Studio 的用户,或者更喜欢使用 Visual Studio 2008,而不是使用 Visual Studio 2010,那么,就必须单独下载 F# 安装包。查找 F# 相关信息的最好地方,是在MSDN 的F# 资源中心,即http://msdn.microsoft.com/fsharp/。在 F# 资源中心页面的左上角有编译器程度的链接,有两个版本,一个是 MSI 版本,如果你已经安装了 Visual Studio,这个版本会自动安装Visual Studio 集成;还有一个 ZIP 版本,它主要针对非 Windows 用户。安装包有这样一些内容:编译器 fsc.exe,fsi.exe(F# 交互控制台),基于F# 解析工具,F# 基本类库,F# 文档和一些 F# 示例。

[实际上,这个页面上已经找不到有关下载的链接了。因为页面也已经看不到 Visual Studio 2008 的内容了。

在页面有一个链接,叫获取适用于 Visual Studio Express 2012 for Web 的 Visual F# 工具。而这个页面打开的基本上都是 Visual Studio Express 2013 的内容。

而Visual Studio Express 2013 已经自带 F# 了。

]

 

在Windows 有Visual Studio 2008 上安装 F#

 

这一节主要针对使用老版本Visual Studio 的用户。(前面说过,Visual Studio 2010 的用户已经安装了 F#。)在Windows 有Visual Studio 2008 上安装 F#,也非常简单,需要有系统管理员权限的帐号运行,下载前一节中描述的 MSI版本,然后执行即可。

请注意,在写作本书时,免费的 Visual Studio Express 版本还不支持插件,因此,不能用这个的 F# 集成。有关Visual Studio 2008 的更多内容参见 MSDN 的扩展 VisualStudio,http://msdn.microsoft.com/vsx2008

[不过,而在已经看不到 VisualStudio 2008 的内容了,好像只有 Visual Studio 2010]

 

在Linux 上安装F#

 

如果你不熟悉 Linux,但是愿意尝试一下 Mono,最简单的办法是在 Mono 网站上下载 SUSE Linux 虚拟机的映像文件,地址为http://www.go-mono.com/mono-downloads/

 

Mono 是通用语言运行时(CommonLanguage Runtime,CLR)的一个免费、开源、多平台实现,它符合通用语言基础(Common Language Infrastructure,CLI)的 ECMA 规范,和 Microsoft.NET 兼容,由 Novell 和大量的社区自愿者共同完成。

 

[

Mono

Richard Stallman,GNU工程创始人和GPL作者,指责在Debian里安装“Mono”对于开源来说是一个“危险”的举动。什么是MONO? MONO项目是由Ximian发起的,由Miguel de lcaza领导的,一个致力于开创.NET在Linux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了ADO.NET和ASP.NET。能够使得开发人员在Linux用C#开发程序。

Richard Stallman在一份声明中称,“微软很有可能计划有一天突然行使其专利权,而所有的开源C#程序都将受到影响。这是一个危险的举动(指的是Mono进入Debian安装包),只有傻瓜才会忽略这个问题。”

]

 

这个虚拟机映像文件已经预安装了最新的 Mono 运行时和开发工具,因此,不需要考虑任何的设置问题。但是,目前还不包含 F# 编译器,需要通过下面的命令进行手工安装。我执行这些步骤使用的是 root 帐号。

1、仍然在 /usr/lib/fsharp 目录中,运行命令 shinstall-mono.sh。[似乎应该是新建目录]

2、解包 F# 发布包,复制文件到 /usr/lib/fsharp;

3、在 /usr/lib/fsharp  目录中,运行chmod +x install-mono.sh;

4、运行文本文件 install-mono.sh中的 dos2unix 工具;

5、仍然在 /usr/lib/fsharp 目录中,运行命令 shinstall-mono.sh。

执行这些步骤后,就可以在命令行上用任何帐号使用F#,运行mono /usr/lib/fsharp/bin/fsc.exe,后面加命令行选项。很明显,每次都这样运行就太麻烦了,因此,我在 /usr/bin 中创建一个脚本文件叫fsc。

 

#!/bin/sh

exec /usr/bin/mono $MONO_OPTIONS/usr/lib/fsharp/bin/fsc.exe "$@"

 

然后运行chmod +x fsc,给用户执行权限。以后,运行F# 编译器,只需要在命令行上简单地输入fsc 可以了。同理,F# 交互编译器,fsi.exe,也可以用下面的脚本文件:

 

#!/bin/sh

exec /usr/bin/mono $MONO_OPTIONS/usr/lib/fsharp/bin/fsi.exe --no-gui "$@"

 

图 2-2 显示的是运行在 Linux Mono 下的交互式 F#。

图 2-2 运行在 Linux Mono 下的交互式 F#

 

以不同的方法使用F#

 

F# 程序就是文本文件,因此,可以使用任何文本编辑器创建,只要保存的程序以 .fs 做扩展名,用fsc.exe 进行编译。例如,在文本文件 helloworld.fs 中有下面的程序:

 

printfn "Hello World"

 

只需要运行fsc.exe helloworld.fs,把程序编译成 helloworld.exe,程序就能在控制台输出下列文本:

 

Hello World

 

Visual Studio

 

开发F# 程序,我认为最容易、最快捷的方法是使用Visual Studio 中的F# 交互编译器(如图2-3)。可以在文本编辑器中输入F# 程序,利用语法高亮和智能提示完成代码,然后,编译成可执行文件,设置断点,按F5 启动交互调试。还可以用交互方式执行一段代码。选择想执行的代码,按Alt+Enter,F# 会执行这一段代码,并显示结果。这极大地方便了测试代码片断。

 

图2-3 在Visual Studio中交互执行F#

 

SharpDevelop

 

SharpDevelop 是一个有 F# 绑定的、开源的集成开发环境,能够用于 .NET 和 Mono 的开发。F# 绑定是由SharpDevelop 打包的,因此,所有要做的就是保证已经安装了 F#,然后,再安装SharpDevelop。之后,唯一要做的事情就是创建一个新的 F# 项目。有 F# 的SharpDevelop并没有提供像 Visual Studio 那么多的功能,只有语法高亮和 F# 交互。然而,其开发环境仍然非常有用,且是开源的,因此,如果你打算对它进行扩展,也可参加到这个项目中来。图2-4显示了用SharpDevelop 打开的一个 F# 项目。

图 2-4 SharpDevelop 打开的 F# 项目

 

 

F# 交互命令行

 

 

如果你愿意,也可以直接在F# 交互控制台中输入程序,在单机模式下运行,如图2-5。

图 2-5 运行在单机模式下的F# 交互控制台

 

使用交互式控制台输入代码,完成一段后,以两个分号(;;)结束,表示编译器可以编译并运行了。

F# 交互以两种方式响应命令。如果把值绑定到标识赋,将输出标识符的名字和类型。因此,在F# 交互中输入下列内容:

 

> let i = 1 + 2;;

 

结果如下:

 

val i : int

 

然而,如果在F# 交互中只输入值,响应会有一些不同。在F# 交互中输入下列内容:

 

> 1 + 2;;

 

结果如下:

 

val it : int = 3

 

这表示3被绑定到专门的标识符it,它对这次F# 交互会话的其他代码也是可用的。前面的表达式计算后,它的值也会输出到等于号的后边,(就如前面例子中的3)。随着你对fsi.exe 和F# 整体上的了解加深,就会发现在调试程序、研究其工作机制方面,F# 交互会非常有用。(我们会在第三章详细讨论值、标识符和类型。)

通过按Tab 键可以实现代码的自动完成。我发现这种工作模式,对于测试很短的程序,[不需要]通过复制、粘贴到控制台,或者为了检查已有库函数的属性方面会很有用。例如,在图2-5 中[不是图 2-2],我们查看了System.Environment.Version 属性。然而,我发现这种模式在写大程序时是不方便的,因为,程序一旦编码以后,存储很困难,必须使用复制、粘贴到控制台。使用Visual Studio,即使不打算交互运行,你仍可以很容易用Alt+Enter 执行代码片断。

 

 

本书的示例

 

本书中的代码主要是使用 fsc.exe 而不是 fsi.exe。虽然 fsi.exe 在测试代码、运行简单脚本和运行体验等方面很方便,但是,我相信,fsc.exe 对于写完整的软件会更有用。由于它们在语法和命令方面差异并不大,因此,大多数很少或几乎不要修改就能用 fsi.exe 运行,如果需要修改,我会有提示。

示例代码可以从http://bfs.codeplex.com/下载,本书中的所有示例都在运行 windows 7 且使用 .NET 4.0 的系统上测试通过,部分程序也通过了运行 Linux 使用 Mono 2.4.2.3 系统的测试。

 

 

本章小结

 

这一章介绍了如何安装和运行 F#,以及不同的使用方法,后续章节将介绍如何用 F# 来编程,第三章首先介绍用 F# 进行函数式编程。

 

### 计算机网络第二章课后习题答案 #### FDM (Frequency Division Multiplexing) 频分多路复用是一种通信技术,在这种技术中,载波带宽被划分为多个不同的频率子信道。每个子信道可以独立传输数据流[^2]。 #### FDMA (Frequency Division Multiple Access) 频分多址接入是在无线通信领域的一种访问方法,通过分配不同频率给各个用户来实现资源共享。这种方式允许在同一时间内有多个设备使用相同的物理媒介而不会相互干扰。 #### TDM (Time Division Multiplexing) 时分多路复用是指将时间分割成周期性的帧,并进一步划分这些帧为若干个时隙。每个源占用固定的一个或几个时隙用于发送信号。 #### TDMA (Time Division Multiple Access) 时分多址接入也是一种共享介质的方法,它基于TDM原理工作,但在移动电话系统中有广泛应用。各站轮流获得整个频道一段时间来进行发射。 #### STDM (Statistical Time Division Multiplexing) 统计时分多路复用是对传统TDM改进后的形式,能够更高效地利用资源。在这种模式下,只有当某个连接确实有数据要传送时才会为其分配时隙。 #### WDM (Wavelength Division Multiplexing) 波分多路复用是光纤通讯中的关键技术之一,其基本思想是在一根光纤上同时携带多种不同波长(颜色)光束的信息流。 #### DWDM (Dense Wavelength Division Multiplexing) 密集型波分多路复用指的是在一个非常窄的范围内放置大量紧密间隔开来的波长通道的技术,从而极大地提高了单根光纤的数据承载能力。 #### CDMA (Code Division Multiple Access) 码分多址接入采用扩频调制方式,使得所有用户的信号可以在同一时刻占据全部可用频谱宽度;但是通过对每条消息附加唯一的伪随机序列作为识别标志区分彼此。 #### SONET (Synchronous Optical Network) 同步光纤网是一个标准化协议集,旨在定义高速率、大容量数字传输系统的接口标准和技术规格。SONET主要用于北美地区。 #### SDH (Synchronous Digital Hierarchy) 同步数字体系类似于SONET,但主要应用于欧洲和其他一些国家和地区。两者都是为了提供一种全球统一的标准框架以便于构建高效的电信基础设施。 #### STM-1 (Synchronous Transport Module level 1) 这是SDH系列中最基础的速度等级,对应着大约155 Mbps的数据速率。更高层次如STM-4, STM-16等则依次递增四倍速度。 #### OC-48 (Optical Carrier level 48) 属于SONET标准的一部分,表示特定级别的光学载体,支持约2.4 Gbps的数据吞吐量。同样存在更低级别比如OC-3以及更高级别的版本像OC-192等等。 ```python def calculate_rtt_sum(rtt_values): """ Calculate the sum of RTTs including initial three-way handshake. Args: rtt_values (list): List containing individual round trip times Returns: float: Summation value considering all provided RTTs plus first connection setup time """ if not isinstance(rtt_values, list) or len(rtt_values) == 0: raise ValueError("Invalid input") # Initial three-way handshake contributes twice to total delay compared with subsequent connections return 2 * rtt_values[0] + sum(rtt_values) # Example usage rtt_example = [1.2, 0.8, 1.0] print(f"The calculated RTT sum is {calculate_rtt_sum(rtt_example)} seconds.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值