F#入门-第二章 F#基础-第八节 for循环

    本节对F#中的for循环进行介绍。
    以下是F#中的基本的for循环的编写方法。

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


    for语句1是c语言风格的循环方式。for语句2是一般所说的foreach循环。
    for语句2在F#中称作sequence循环。

    for语句1是在表达式1中将循环变量进行初始化,循环执行表达式3,一直循环到循环变量与表达式2相等时停止循环。

c语言风格的for循环
for i=0 to 5 do print_endline (Int32.to_string i) done;;


    上述代码为将0开始一直到5之间的6个数值进行标准输出显示。(标准输出指输出到默认设备上,一般指控制台的显示界面。)

    在for语句2中,将表达式4中的元素一个个绑定给循环变量,然后执行表达式5。

foreach风格的循环
for i in [1;2;3;4;5;] do print_endline (Int32.to_string i) done;;
for i in [|1;2;3;4;5;|] do print_endline (Int32.to_string i) done;;
for i in ["abc";"def";"ghi";] do print_endline i done;;
for (a,b) in [("melon","fruit");("watermelon","vegetable")] do print_endline (a ^ " is " ^ b); done;;


    上述代码中,将列表或数组中的元素,用foreach风格的循环进行循环输出。
    因为不在列表中或数组的元素是访问不到的,所以当循环访问列表或数组时,这种风格比C语言风格的循环更加具有优势。

    正如上述例子所示,对象只要有序列,就可以进行循环访问。具体来说,只要是以下对象,就可以循环访问。
    列表或数组
    所有seq数据类型
    所有支持GetEnumerator方法的数据类型

    前几个例子因为是列表,所以把用分号分隔开的所有元素都绑定给了变量i,然后逐个执行显示语句.
    最后一个例子是针对二维列表进行的循环,所以进行了模式匹配功能.第一个元素("melon","fruit")与(a,b)相比对,将"melon"匹配给a,"fruit"匹配给b,然后执行后面的输出语句,二维列表中后面的其它元素都照此办理。具体参照模式匹配一节。

    使用这种foreach循环方式,可以对.Net Framework的集合(因为封装了GetEnumerator方法)进行迭代(遍历集合中每一个元素)。

    另外,for循环不仅可以用来进行循环访问,还可以将循环的结果用列表进行保存。

    另外,下述例子中的->符号读作yield。

foreach风格的循环2
> [1..3];;
val it : int list = [1; 2; 3]
> [for i in [1..3] -> i*2];;
val it : int list = [2; 4; 6]
> [for i in [1..3] -> [for j in [2..4] -> (i,j)]];;
val it : (int * int) list list
= [[(1, 2); (1, 3); (1, 4)]; [(2, 2); (2, 3); (2, 4)]; [(3, 2); (3, 3); (3, 4)]]


    F#是十分简便的编程方法,所以可以用[a..b]的写法代表连续数值的列表。
    上述代码为将[1..3]这个列表中的每个元素乘以2,然后按顺序组合输出[1..3]、[2..4]这样的列表。

posted @ 2010-09-30 16:15  至尊无上  阅读(1231)  评论(0)    收藏  举报