结合实例学习F#(一)--快速入门 - 面向对象网 f# 学习 对象 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > F# > 正文

结合实例学习F#(一)--快速入门

来源: www.bianceng.cn 阅读:

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] <- 1
11 loop (hd::acc) tl
12 loop [] [2 .. n]
13
14 let primesBefore120 = GetAllPrimesBefore 120

废话少说,直接进入正题吧

1 let GetAllPrimesBefore n =

第一行,申明函数GetAllPrimesBefore, 并且该函数有一个参数n, 在这里我没有指定n的类型,因为编绎器可以通过函数体对n的类型进去推断,比如在本例中,n就是int类型,当然我们也可以显示的指定n的类型,比如 let GetAllPrimesBefore (n:int),这样我们就指定了n为int型 (注意:(n:int)中的括号不能省略,let GetAllPrimesBefore n : int 的意思是该函数返回的值的int型)。说完了参数,再说下返回值,同样,编绎器会根据函数体上下文对返回值类型进去推断,所以我们不需要申明返回类型。

2 let container = Array.create (n+1) 0

第二行,首先请注意该行与第一行相对有一个缩进({TAB}),F#和Python一样,也是通过{TAB}缩进来组织代码结构的。这一行我们定义了一个变量container,它的类型是Array,大小为 n+1, 并且值全部初使化为0

1 let rec loop acc = function
2 |[] -> 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] <- 1
9 loop (hd::acc) tl

接下来就是这个函数的主要部分了(原程序中的3-11行),首先我们定义了一个递归函数(我们发现定义递归函数需要加rec关键字)。它接受两个参数,acc和一个List,有朋友可能要问了,这里明明我只看到一个参数acc,你说的那个List在哪呢?可能有细心的朋友也发现了这里的函数定义不光前面有rec,在等号后面还加了个function,那么function是做什么用的呢?

let rec loop acc = function

这里我需要首先讲一下Pattern Matching, Pattern Matching有些类似于C#中的switch语句(当然它要比C#中的switch强大许多,但这不是本文的目地,所以略去不表),可以根据expr的值去执行某一具体分支,它的基本语法也很简单,我们还是结合一个具体实例来看一下(例子比较简单,只是为了说明问题)。 这个例子大家很容易看懂吧,我就不详细解释了,只是说明一点,'_'用来匹配所有别的情况。

let ShowGreeting laguageInUse = 
match laguageInUse with
| "C#" -> 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!"

Tags:
相关文章列表: