F#随着VSTS 2010 Beta1 发布也有一段时间了,园子里应该也有不少人对它感兴趣吧。下面的例子是我在学F# 基本语法时写的一个简单Sieve of Eratosthenes 实现,通过剖析这一小段代码,我希望大家能对F#有个简单认识,并能自己写一些简单的小程序。
1 let GetAllPrimesBefore n =
2 let container = Array.create (n+1) 0
3 let rec loop acc = function
4 |[] -> List.rev acc
5 |hd::tl ->
6 if container.[hd] =1 then
7 loop acc tl
8 else
9 for j in [hd .. hd .. n] do
10 container.[j] List.rev acc
3 |hd::tl ->
4 if container.[hd] =1 then
5 loop acc tl
6 else
7 for j in [hd .. hd .. n] do
8 container.[j] printfn "Hello, C# developer!"
| "F#" -> printfn "Hello, F# developer!"
|_ -> printfn "Hello, other developers!"因为Pattern Matching在F#中的使用范围实在太广了,所以就引入了一种简化版,这就是上面大家看到的等号后面的function的作用,我们可以把上面的例子简化成
let ShowGreeting = function
| "C#" -> printfn "Hello, C# developer!"
| "F#" -> printfn "Hello, F# developer!"
|_ -> printfn "Hello, other developers!"怎么样?既少了给参数起名的烦恼,也少敲不少字吧,嘿嘿。
接下来我再简单介绍下F#中非常重要的一个基本类型List, 其基本表示形式为 [ item1;item2; .. ;itemn]
F#中List是immutable类型,我们只能访问里面的值,不能改动里面的值,任何改动List的需求只能通过构建新的List来实现。稍一思考,大家就会很快发现要实现一个高效的immutable list, 那最简单的就是对其头结点进去操作了(插入和删除都可以达到O(1),当然插入和删除会构建一个新的List,原List不会改变),F#中的List也是基于这种形式,所有的List都可以看成是Head+Tail(除了Head外的所有结点),F#提供了相应的库函数List.hd, List.tl,并且提供了:: (cons operator)来帮助我们方便的构建一个List,比如1::2::[]就表示List [1;2] (注意1和2之间我用的是;不是, 如果写成[1,2],那个表示该List只有一个元素 (1,2),至于(1,2)是什么类型,为了使文章尽量紧凑,我们今天就不讲了)
有了上面这些知识,再看本文一开始的函数就简单多了
let rec loop acc = function
|[] -> List.rev acc
|hd::tl ->
if container.[hd] =1 then
loop acc tl
else
for j in [hd .. hd .. n] do
container.[j] |