F#第二课
F#第二课
今天又学习了一下F#,对这门新兴的语言又有了一点新的认识。下面我们体验一下VS2010 Beta2与F#的威力吧。
首先我们利用VS2010来创建一个新的F#工程,这跟其他所有.Net的语言一样没有什么特别的。
接下来我们就要开始写一个F#程序,既然F#是函数式编程语言,那我们就先来写一个比较简单的函数。
let CharNum str = let num = String.length str num |
那么在以前,我们需要将这个文件导入到F#的交互环境中编译并运行。这个过程稍微麻烦了一些。现在VS2010可以帮我们解决这个烦恼,你只需要将F#的交换窗口在VS IDE中显示出来就可以(View->Other Windows->F# Interactive)。这是真正的F#交互式窗口,我们所要做的就是将要测试的代码选中,按Alt + Enter就可以将函数导入到交互环境中。
这就是IDE给我们带来的好处。F#一共有两种格式的源文件:*.fs和*.fsx。*.fs是F#的实现源代码文件,而*.fsx则是F#的脚本文件。他们之间的区别就是你可以右键*.fsx文件直接运行该代码到F#交互环境中。
说过VS2010的IDE,下面我们再说说F#的语言点吧。从上面的小例子,学习过其他语言的朋友会发现这F#的语言语法规则非常特别。简要介绍一下这个例子:
let CharNum str = // 声明一个函数 let num = String.length str // 声明一个变量 num // 返回值 |
关键字let … = …是F#里面最常用的一个关键字。它可以用来声明变量,函数还有对象。另外F#是通过空格来分隔参数的,而不是我们习惯的逗号。最后一行是函数的返回值。所有的F#函数都有一个返回值,哪怕你不写返回值,F#编译器则会默认设置一个unit类型的值为返回值。不过这个特性可能在跨语言调用中需要注意一下。
我们再看一个list的例子:
let list = [1..10] let list1 = List.filter(fun n-> n%2 = 0) list |
运行结果
val list : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
val list1 : int list = [2; 4; 6; 8; 10]
这个例子里包含了2个F#的特性:一个是列表容器,另一个是lambda表达式。在F#中声明并初始化List容器是很容易的,即用[]括起即可。其实在F#中一共有三种最常用的容器:Tuple(元组)用()表示,List(列表)用[]表示和Record(记录)用{}表示。事实上,我们初始化list更多用的是[X;Y;Z]方式。对于lambda表达式,这个并不是F#专有的,并入C#中就可以用Func<int, int>模板来声明。唯一的区别是F#使用了一个fun关键字来做这个工作。在这两个例子中,我都用到了F#的库函数String和List类,这也说明了F#也可以进行面向对象开发。
今天最后一个例子是F#中的管道。我们知道管道的作用是将一方的计算结果用做于另一方的输入。改进上面的例子
[1..10] |> List.filter(fun n-> n%2 = 0) |
我们可以得到与上一例子相同的结果。F#中的管道是使用|>符号来表示的,所以管道的两边计算结果类型必须一致。
这些例子只是F#中的一些非常简单的语法,但是这些例子如果用其他语言来表示,则需要做很多的工作。可以看出F#的表达方式还是非常简洁的,而且F#的优势更是在于数值计算。
题外话:
在网上,很多朋友都遇到了一个编译问题,就是String.Split总是编译不能通过。这个问题我也研究了很久,很显然VS2010 Beta2还没有去集成FSharp.PowerPack.DLL这个文件,我们还需要手动的去引用这个文件在交互环境中。