ZetCode

F# for 和 while 循环

最后修改时间 2025 年 5 月 1 日

在本文中,我们将介绍如何在 F# 中使用 for 和 while 循环。

循环用于重复执行一段代码。有两种类型的循环:for 和 while。

F# for in 循环

使用 for in 循环,我们逐一遍历一系列值。

main.fsx
let vals = seq { 1..5 }

for e in vals do
    printfn "%d" e

printfn "--------------------"

let len = Seq.length (vals) - 1

for idx in 0..len do
    printfn "%d" (Seq.item idx vals)

在程序中,我们循环遍历一个整数序列。

let vals = seq { 1..5 }

使用 seq,我们定义了一个包含五个整数的序列。

for e in vals do
    printfn "%d" e

我们遍历该序列并打印每个数字。

let len = Seq.length (vals) - 1

for idx in 0..len do
    printfn "%d" (Seq.item idx vals)

在这段代码中,我们循环遍历一个数字范围。范围内的值用作序列的索引。

λ dotnet fsi main.fsx
1
2
3
4
5
--------------------
1
2
3
4
5

F# for to/downto

使用 todownto 关键字,我们可以迭代一个值范围。

main.fsx
for e = 1 to 5 do
    printfn "%d" e

for e = 5 downto 1 do
    printfn "%d" e

该程序循环遍历 1..5 和 5..1 的范围。

λ dotnet fsi main.fsx
1
2
3
4
5
5
4
3
2
1

F# 执行 n 次

编程中的一个常见任务是执行某项操作 n 次。我们可以使用 for 循环和范围来实现这一点。

main.fsx
for _ in 0..5 do 
    printfn "%s" "falcon"

在程序中,我们将 "falcon" 这个词打印六次。由于我们不需要范围的值,因此我们使用 _ 操作符。

λ dotnet fsi main.fsx
falcon
falcon
falcon
falcon
falcon
falcon

F# 带有范围的 for in 循环

范围运算符可用于 for 循环。

main.fsx
for e in 1..2..10 do
    printfn "%d" e

for e in 10..-2..0 do
    printfn "%d" e

我们可以使用不同的步长创建升序和降序范围。

λ dotnet fsi main.fsx
1
3
5
7
9
10
8
6
4
2
0

F# 嵌套 for 循环

For 循环可以嵌套。

main.fsx
for i in [1; 2; 3; 4; 5; 6; 7; 6; 5; 4; 3; 2; 1] do
    for _ in 1..i do
        printf "*"
    printf "\n"

通过两个 for 循环,我们使用 * 字符创建了一个矩形。对于外层循环的每个周期,内层循环都会执行 n 次。

λ dotnet fsi main.fsx
*
**
***
****
*****
******
*******
******
*****
****
***
**
*

带函数的 F# for 循环

For 循环实际上是表达式。

main.fsx
open System

let rand1 () =
    Random(DateTime.Now.Millisecond).NextInt64(1, 10)

let rand2 () =
    Random(DateTime.Now.Millisecond).NextInt64(10, 20)

for e in rand1 () .. rand2 () do
    printfn "%d" e

printfn "--------------------------------"

for e = int (rand1 ()) to int (rand2 ()) do
    printfn "%d" e

在示例中,我们在 for 范围中使用计算出的随机值。

let rand1 () =
    Random(DateTime.Now.Millisecond).NextInt64(1, 10)

使用 random,我们生成一个介于 1 和 10 之间的随机数。

for e in rand1 () .. rand2 () do
    printfn "%d" e

这两个函数的返回值用于生成一个随机值范围。

λ dotnet fsi main.fsx
2
3
4
5
6
7
8
9
10
11
--------------------------------
6
7
8
9
10
11
12
13
14
15

F# while 循环

while 循环是一种控制流语句,它允许根据给定的布尔条件重复执行代码。

main.fsx
let vals = [ 1; 2; 3; 4; 5 ]

let mutable i = 0

while i < vals.Length do
    printfn "%d" val[i]
    i <- i + 1

在此 while 循环中,我们以经典的命令式方式循环遍历列表元素。

F# 函数式迭代

for 和 while 循环用于创建命令式循环。函数式语言通常倾向于使用函数来迭代序列。

main.fsx
let vals = [ 1; 2; 3; 4; 5 ]

List.iter (printfn "%d") vals

例如,F# 有 List.iter 来遍历列表的元素。

在本文中,我们学习了 F# 中的 for 和 while 循环。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。