一、引言:
计算机程序设计语言的进步是多维度体现的,就“语法”、“人性化”两个基本的要素而言,面向对象的C#可以说是达到了登峰造极的地步。如果和我们今天要讨论的F#(Functional Language,函数型或功能性语言)相比较而言,C#在人性化上面显得略微单薄了点,拿简单的赋值语句做一个例子:
int[] numbers = new int[100];
for (int i =1; i<101;++i)
{
numbers[i] =i;
}
这种程序再常见也不过了!可是为了达到这个目的,我们不得不把赋值的过程一步步展示出来,并且把它转化成IDE可以理解的形式告知计算机进行编译执行。这显然是违背我们本意的。对于我们人类思维而言,是最好隐藏定义数组大小和循环这个过程,直接用人类自然语言去描述这个问题(To Fill with the array from 1 to 100!),用伪代码(Pseudo Code)描述便是如下:
numbers = from 1 to 100 filled;
这有一点类似于第四代语言的SQL——我们只要把问题描述清楚,而不是去想方设法把人类解题思路转换成计算机的思维进行解题。所以如果存在这样一种能够以人类自然语言作为计算机描述问题的开发工具(是让机器服从于人,而不是人服从于机器!),能够大大简化语法,提高人和机器的亲和力。
二、解释型的F#:
和以往所见的C#不同,F#既可以解释运行也可以编译运行。为了方便熟练上手,我们还是先使用解释型的。安装完VS2010之后(或者是VS2008的F#补丁包)之后,运行Visual Studio Tools文件夹(应该在开始菜单的VS2010或者VS2008内)中的“Visual Studio Command Prompt”程序,输入fsi回车即进入解释型的F#控制台界面,是不是回到了Logo语言或者DOS年代的感觉?
三、一些基本的F#语法:
1)首先来说说输出语句吧,一般程序入门总爱“Hello World!”。我也不例外:
在“>”后面输入:printfn “Hello World!”;;
注意:“;;”表示执行这句(命令)。后面跟一串引号的输出字符串即可,中间必须空格,F#的一般函数是不需要加括弧的(在F#中括弧是元组类型,后面讲到)。
2)变量赋值let关键字:
let a = 5;;
let a = “string”;;
似乎你可以随时使用let修改同一个变量a的数值,则a的类型自动变化(相对于C#而言,一旦var根据后面类型确定以后就无法变更类型了)。
3)在F#中再次赋值的符号不是“=”,比如你不能使用 a = 6;;再次赋值,因为F#不提倡使用可变的量(线程等问题)。但是考虑有些特殊需要,您也可以这样用,必须加mutable声明:
let mutable a = 5;;
a <- 6;;
此时,你不能把a的类型改变成其它类型了(比如a <- “string”,会报错的)。除非你使用强制转换(规则和C#一致):
>open System;;
>a <- Convert.ToInt32 “6”;;
>a;;
这样你查看到a变成了6.如果想改变类型,仍然按照2)的步骤就可以了。
4)F#最有趣的地方在于它把函数当成变量一样的方法定义:
> let Add a b = a+b;;
>Add 5 6;;
定义规则必须是:let 函数名 变量1……变量n = 对变量操作的符号;; (其中各个变量中间只能用空格隔开,并且“函数名”和第一个变量也用空格隔开)。
当然你还可以声明匿名函数,必须用到关键词fun:
>fun x -> x+2;; (x是变量)。
它会自动产生一个叫it的变量,您只要用“it 数字”就可以得到结果了。
5)F#中使用“元组”(tuple)类型的数据,可以理解成一个由各种类型组合的集合:
> let element = (3,”Hello World!!”);;
要取出第一(二)个元素,可以使用:
> fst(snd) element;;
但是如果被操作的元素个数超过2个,你就不允许这样做(因为fst和snd被定义了只能针对两个数量的元素操作),您可以这样:
>let (a,b,c) = (1,2,3);;
然后分别打印abc各自的数值,注意,元组变量个数必须匹配被赋值的元组内的个数,不能写(a,b)。如果你要前两个,则必须写成let (a,b,_) = (1,2,3);;
四、批量执行F#语句:
你实际上完全可以在每句话完成以后直接敲击回车而不是“;;”符号后才敲击,这样提示符从“>”变成“-”,然后你继续你的语句,直到末尾一句完成,输入“;;”然后才回车,这样F#就被批量执行了,有点写批处理文件执行的感觉。