控制流程(Control Flow)
在函数式编程(中)一文中,我们初步了解了F#在函数式编程范式下的控制流程,即if, elif, then, else等组成的结构。在命令式编程范式下,F#提供了更多的控制流程支持,包括if,while和for。
在命令式编程范式下的if结构与函数式编程下对应结构的主要差别在于,对于if分支,调用的函数为unit类型(即无返回值),而且并不要求必须使用else分支:
F# Code
if System.DateTime.Now.DayOfWeek = System.DayOfWeek.Thursday then
print_endline "Thursday play list: lazy afternoon"
这里print_endline函数的类型为string -> int。尽管else分支不是必须的,但如果需要,你也可以加上,不过else分支也必须为unit类型。
F# Code
if System.DateTime.Now.DayOfWeek = System.DayOfWeek.Thursday then
print_endline "Thursday play list: lazy afternoon"
else
print_endline "Alt play list: pop music"
至此,不管if结构的分支是否返回值,我们都有办法表示,这样就跟C#的if结构一致了。
在C#中,如果一个分支的语句多于一条,需要使用花括号,而在F#中,分支所包含的语句要通过缩进来表示。
for循环是命令式编程中一种常见的结构。如果你有过C#或VB.NET的经验,那么很容易理解:
F# Code
let sentence = [| "To "; "live "; "is "; "to "; "function." |]
for index = 0 to Array.length sentence - 1 do
System.Console.Write sentence.[index]
在C#中,for循环是否执行需要看中间的bool表达式的结果,而这里则是看局部值index是否在指定的范围内,而且初始值要小于终止值。F#还提供了另一种for循环结构:
F# Code
let whitePollution = [| "This term refers to "; "pollution caused by ";
"litter of used plastic bags, "; "polystyrene cups, ";
"food containers and paper." |]
for index = Array.length whitePollution - 1 downto 0 do
System.Console.Write whitePollution.[index]
此时index的值将以递减顺序变化。
while循环也较为简单,与C#很相似,直接看个例子吧:
F# Code
// 压洲
let pressureContinent = ref [ "This phrase's pronunciation is ";
"similar to "Asia" in Chinese, "; "but it means ";
"a continent of pressure." ]
while (List.nonempty !pressureContinent) do
System.Console.Write(List.hd !pressureContinent);
pressureContinent := List.tl !pressureContinent
循环推导(Loops over Comprehensions)
可以使用for循环来枚举一个集合,这种方式与C#中的foreach结构类似。下面的例子对一个字符串数组进行枚举。
F# Code
let words = [| "Red"; "Lorry"; "Yellow"; "Lorry" |]
for word in words do
print_endline word