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循环不能被用在存粹的函数式类型,因为你不可以改变判定而循环永远也不会终止。