循环:for...in 表达式 (F#)
此循环构造用于循环访问可枚举集合(例如,范围表达式、序列、列表、数组或其他支持枚举的构造)中的模式匹配项。
for pattern in enumerable-expression do
body-expression
备注
可以将 for…in 表达式比作其他 .NET 语言中的 for each 语句,因为它可以用于循环可枚举集合中的值。 不过,for…in 还支持针对集合的模式匹配,而不仅仅是迭代整个集合。
可以将可枚举表达式指定为一个可枚举集合,也可以使用 .. 运算符将其指定为一个整数类型范围。 可枚举集合包括列表、序列、数组、集、映射等等。 可以使用实现 IEnumerable 的任何类型。
当使用 .. 运算符表示范围时,可以使用下面的语法。
start .. finish
也可以使用另一种包括一个称为“skip”的递增量的语法形式,如以下代码中所示。
start .. skip .. finish
当使用整数范围和简单的计数器变量作为模式时,通常的做法是在每次迭代后将计数器变量递增 1,但如果范围包括 skip 值,则计数器将改为递增 skip 值。
在此模式中匹配的值还可以用在主体表达式内。
下面的代码示例演示 for...in 表达式的用法。
// Looping over a list.
let list1 = [ 1; 5; 100; 450; 788 ]
for i in list1 do
printfn "%d" i
输出如下所示。
1
5
100
450
788
下面的示例演示如何循环一个序列,以及如何使用元组模式来代替简单变量。
let seq1 = seq { for i in 1 .. 10 -> (i, i*i) }
for (a, asqr) in seq1 do
printfn "%d squared is %d" a asqr
输出如下所示。
1 squared is 1
2 squared is 4
3 squared is 9
4 squared is 16
5 squared is 25
6 squared is 36
7 squared is 49
8 squared is 64
9 squared is 81
10 squared is 100
下面的示例演示如何循环一个简单的整数范围。
let function1() =
for i in 1 .. 10 do
printf "%d " i
printfn ""
function1()
function1 的输出如下所示。
1 2 3 4 5 6 7 8 9 10
下面的示例演示如何循环一个 skip 值为 2 的范围(在范围中循环时每次间隔一个元素)。
let function2() =
for i in 1 .. 2 .. 10 do
printf "%d " i
printfn ""
function2()
function2 的输出如下所示。
1 3 5 7 9
下面的示例演示如何使用一个字符范围。
let function3() =
for c in 'a' .. 'z' do
printf "%c " c
printfn ""
function3()
function3 的输出如下所示。
a b c d e f g h i j k l m n o p q r s t u v w x y z
下面的示例演示如何使用负的 skip 值来进行反向迭代。
let function4() =
for i in 10 .. -1 .. 1 do
printf "%d " i
printfn " ... Lift off!"
function4()
function4 的输出如下所示。
10 9 8 7 6 5 4 3 2 1 ... Lift off!
范围的起始值和结束值还可以是表达式(例如函数),如以下代码中所示。
let beginning x y = x - 2*y
let ending x y = x + 2*y
let function5 x y =
for i in (beginning x y) .. (ending x y) do
printf "%d " i
printfn ""
function5 10 4
使用此输入的 function5 的输出如下所示。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
接下来的示例演示当循环中不需要元素时如何使用通配符 (_)。
let mutable count = 0
for _ in list1 do
count <- count + 1
printfn "Number of elements in list1: %d" count
输出如下所示。
Number of elements in list1: 5
注意可在序列表达式和其他计算表达式中使用 for...in,这种情况下将使用 for...in 表达式的自定义版本。 有关更多信息,请参见序列 (F#)、异步工作流 (F#) 和计算表达式 (F#)。