F#程序设计语言初步(下)

kimmking 2008-09-13
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#不适合你。

Global site tag (gtag.js) - Google Analytics