F#程序设计语言初步
F#,印度数学教育与优秀编程
F#(发音为F sharp)是一种基于OCaml的函数式程序设计语言,它由微软研究院设计。运行它所需的所有工具可从微软免费获得。 F#可以在.NET CLR中运行,这意味着它可用于现存的.NET项目。此外,它还可以利用所有其它.NET代码。它克服了函数式程序设计语言的传统弱点,如缺少库函数,使用工具和开发环境等。 F#语言可以独立使用,但也可以直接插入Visual Studio。F#程序设计语言以完成某个特定任务所用代码行数的高效性著称。同时,据报道它的运行速度与C#一样,对某些任务甚至比C#更快。 安装 为了安装F#,你需要下载安装包。不幸的是,微软的F#网站有点过时了。为了获得该软件的最新版本,可以到微软研究院下载处,然后搜索F#编译器。当前最新版本为2007年5月1日发布的F#1.9.1.9。安装过程和其它Windows 应用程序一样而且也十分简单。安装完成后,当你打开Visual Studio时,就会看到“F# Research Compiler with Visual Studio”已经添加进去。(如图A)。 图 A Visual Studio
我们的第一个F# 项目为了试验一下F# ,在Visual Studio中打开一个新项目。在“其它项目类型”中,将会看到“F# 项目”。目前这里只有模板(如图B),但是作为起步已经满足我们的要求。为新项目命名,单击“确定”。 图 B F#模板 现在,我们有了一个空项目。与标准Windows 窗体或Web应用项目不同,F#模板不会创建一系列目录,默认文件,或任何其它类型的文件。添加一个新条目到模板中,选择“F#源文件”作为模板(如图C)。 图 C F#源文件 你将会看到已经加入了一个新文件。打开该文件,将会显示F#模板中充满了作为简单指南的代码。 尽管本文只对F#作简单介绍,但我们将会看一段简单的代码:斐波那契数列生成器,这是一个了解函数式编程的相当标准的基本程序。 我们将会使用斐波那契数列的标准定义。fib函数代码来自F#手册。下面是我们的简短小程序(列表A): 列表 A // A Fibonacci Sequence generator //Get the command line arguement as an integer type (Int32) letfib_number=int_of_string (System.Environment.GetCommandLineArgs().GetValue(1).ToString()); //Set the label "fib" to be equal to a Fibonacci Sequence function let rec fib n = if n < 2 then 1 else fib (n-2) + fib(n-1);; //Print the input number and the Fibonacci sequence Printf.printf "nThe Fibonacci value of %u is: %un" fib_number (fib fib_number);; //Exit the program, returning a normal status code to the OS exit 0; 程序的第一行是提取命令行参数数组的第二个元素(第一个元素是可执行名本身),并将该参数转化为一个整型数(F#是静态数据类型),然后将该值存储在名称为“fib_sequence”的符号中。 第二行定义一个名为“fib”的函数。如果输入n小于2,该函数输出数字1,否则返回参数分别为n-1与n-2的函数自身调用之和(“rec”属性表示该函数是一个递归函数)。 第三行使用我们熟悉的printf函数输出结果。最后,程序结束。 这段小程序演示了F#很多有趣的方面,如果你在Visual Studio中完成该应用程序将会对此有更深的了解(一定要指定一个用来生成斐波那契数列的整数型命令行参数)。 最有趣的一点是懒惰计算法。懒惰计算法的思想是一个符号是在第一次使用时赋值,而不是在定义时赋值。单步跟踪代码(Visual Studio中安F11键)查看“fib_number”显示尽管“fib_number”在程序的第一行就已经定义,但是直到通过调用printf函数输出才对它进行了赋值。 本例中另一个值得注意的地方是递归的使用。此处通过使用一个递归函数,代码的行数变得很少。尽管本例可能对于较大的数不是很有效(堆栈使用会很大),但是在实现速度方面还有很多其它高效的方法,递归只是一种可以解决许多问题的技术,但并不一定是最好的。 最后一点是从F#可以很简单的访问.NET框架。System.Environment.GetCommandLineArgs()方法的调用很好的完成了我们期望的工作。 通过使用ToString方法将结果对象类型投影到一个字符串,然后通过int_of_string函数投影到一个F# 的int32类型,这些都很好的完成了我们需要的工作。 虽然F#与C#、Java和许多其它编译语言一样都是静态类型,但是它仍旧可以以像Perl语言的方式执行类型引用。 结束语 F#是.NET世界中一种相当独特的语言。它可以被.NET中的任意其它代码编译和调用(也可以调用其它代码)。同时,它还提供了一个交互式运行时环境,该环境已逐行解释的方式工作。 它和大多其它编译语言一样拥有静态类型,但是它可以像很多动态或解释语言一样执行类型引用。它还可以面向对象(但并不是强制的)。 F#文档本身仍旧很少,编写上面的简单程序时,为了找到如何将第一行返回的对象投影成一个整型花费了我很多时间。据说,OCaml语言拥有大量可用于F# 的文档。 按照来自F#网站的消息,F#并没有偏离OCaml很远,但是二者之间肯定有所区别。Visual Studio的集成性也是很好的一点。 因此,前进吧,试一下F#!它是免费的而且你还可以学到一些新的编码技术,即使你已决定F#不适合你。 责任编辑:德东 查看本文国际来源 |