F# 入门(六):F#中的 for/while循环

首先我们来看看F#中基本的for循环编写方法。

for循环

for语句1 := for循环变量 =表达式1 to表达式2 do表达式3 done

for语句2 := for循环变量 in表达式4 do表达式5done

for语句1有点c语言的风格。

for语句2就是一般所说的foreach循环,类似于C#,不过功能更强大。

 

下面我们来看看第一种for循环:

> // For loop

for i = 1 to 5 do

printfn "%d" i;;

1

2

3

4

5

val it :unit = ()

这里在表达式中将循环变量进行初始化,从1循环到5,然后输出每个整数。

 

downto关键字来表示反向递减的循环:

> // Counting down

for i = 5 downto 1 do

printfn "%d" i;;

 

第一种for循环只支持整数,如果循环超过System.Int32.MaxValue次时,你需要用可枚举(enumerable)for循环,即第二种for循环:

> // Enumerable loop

for i in [1 .. 5] do

printfn "%d" i;;

1

2

3

4

5

val it :unit = ()

这跟C#foreach循环类似,但它可以支持模式匹配,这让它比C#更强大。如下面的例子,famousPets中有猫和狗,这里用到了F#中的可区分联合

> // Pet type

type Pet=

| Cat of string * int // Name, Lives

| Dog of string// Name

;;

type Pet=

| Cat of string * int

| Dog of string

 

> letfamousPets = [ Dog("Lassie"); Cat("Felix", 9);Dog("Rin Tin Tin") ];;

valfamousPets : Pet list = [Dog "Lassie"; Cat ("Felix",9); Dog"Rin Tin Tin"]

 

> //Print famous dogs

for Dog(name) in famousPets do

printfn "%s was a famous dog." name;;

Lassiewas a famous dog.

Rin TinTin was a famous dog.

val it :unit = ()

 

对于第二种for循环,只要对象有序列,就可以进行访问,具体来说:

  • 链表或数组
  • 所有seq数据类型
  • 所有支持GetEnumerator方法的数据类型

这里值得注意的是,F#for循环中没有break或者continue关键字,如果真需要,你可以添加一个变量,把for循环转换成while循环。

 

 

下面我们简单介绍下while循环。

while循环

while语句 :=while表达式1 do表达式2done

 

> // While loop

letmutable i = 0

while i < 5 do

i <- i + 1

printfn "i = %d" i;;

i = 1

i = 2

i = 3

i = 4

i = 5

valmutable i : int = 5

while循环不能被用在存粹的函数式类型,因为你不可以改变判定而循环永远也不会终止。

posted @ 2012-02-07 14:41  tryfsharp  阅读(446)  评论(0编辑  收藏  举报