F#编程语言中的流程控制语句

F#编程语言中,有多种选择,并且可以自由地混合和匹配这些风格以满足需求。本文将探讨流程控制语句,尽管它们相当熟悉,但它们仍然具有某种F#特有的风格。

If-Then-Else

无疑在许多其他语言中使用过If-Then-Else流程控制表达式。在F#中不同的是,If-Then-Else是一个语句而不是表达式,因此与之相关的某些规则,例如:

  • 它必须产生一个值,即树中最后一个表达式的值。
  • 每个分支产生的类型必须相同。
  • 如果没有显式的else分支,返回类型是unit,这意味着如果then分支的类型不是unit,需要提供一个else分支。
  • 可以使用elif关键字将If-Then-Else串联起来。

让来看一些实际的例子:

let returnAString x = if x then "cat" else "dog"

从这个例子可以看出,确实需要在两个分支中提供相同的类型,否则会得到编译器错误。

let compareTheNumbers x y = if x = y then "=" elif x < y then "<" else ">"

这里是一个if-elif-else组合的例子。

当运行时,这将产生以下输出:

printfn "%d %s %d" 10 (compareTheNumbers 10 20) 20 printfn "%d %s %d" 20 (compareTheNumbers 20 10) 10 printfn "%d %s %d" 20 (compareTheNumbers 20 20) 2

有时更好的方法是根本不使用If-Elif-Else,而是使用标准的模式匹配。这里有一个例子,将最后一个例子重写为一个函数,它接受一个元组并使用模式匹配来实现与使用If-Elif相同的结果。

let compareTheNumbers (x, y) = match x, y with | x, y when x = y -> "=" | x, y when x < y -> "<" | _, _ -> ">"

For

这个循环构造用于迭代一个可枚举的集合,例如列表/序列或数组。它类似于C#中的foreach。

let sumTheList theList = let mutable total = 0 for i in theList do total <- total + i total

尽管如此,有更好的(更功能性的)方法可以采用。例如,可以使用列表/序列模块中已经存在的许多函数,这可能会消除使用循环的需要。以下是使用标准List模块的List.sum函数重写上述例子。

let theSum = List.sum [1..10]

For..To

还可以进行for循环直到某个结束条件,也可以进行for循环直到某个结束条件。这里有一个小型示例,展示了这两种情况:

let forUpFunction() = printfn "for i = 1 to 10 do\r\n" for i = 1 to 10 do printf "%d " i printfn "\r\n" let forDownFunction() = printfn "for i = 10 downto 1 do\r\n" for i = 10 downto 1 do printf "%d " i

当运行时,会产生以下输出:

F#还提供了熟悉的While/Do循环构造,可能已经在其他语言中看到/使用过。

let findANumberInAList theList theNum = let mutable index = 0 let mutable found = false let mutable current = 0 let listHasItem = (List.exists (fun el -> el = theNum) theList) if listHasItem then while not found do current <- List.nth theList index if (current = theNum) then printfn "Found %A in source list at index %A" theNum index found <- true index <- index + 1 printfn "SourceList = %A\r\n" [1..10] findANumberInAList [1..10] 4
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485