このループコンストラクトは、範囲式、シーケンス、リスト、配列、列挙型をサポートするその他のコンストラクトなど、列挙可能なコレクション内のパターンの一致を反復処理するために使用されます。
構文
for pattern in enumerable-expression do
body-expression
注釈
for...in
式は、列挙可能なコレクション内の値をループ処理するために使用されるため、他の .NET 言語のfor each
ステートメントと比較できます。 ただし、 for...in
では、コレクション全体を反復処理するのではなく、コレクションに対するパターン マッチングもサポートしています。
列挙可能な式は、列挙可能なコレクションとして指定することも、 ..
演算子を使用して指定することもできます。 列挙可能なコレクションには、リスト、シーケンス、配列、セット、マップなどが含まれます。
System.Collections.IEnumerable
を実装する任意の型を使用できます。
..
演算子を使用して範囲を表す場合は、次の構文を使用できます。
start .. 終える
次のコードのように、 skip と呼ばれる増分を含むバージョンを使用することもできます。
start .. skip .. 終える
スキップ値が指定されていない場合、コレクションで生成される次の値は 1 ずつインクリメントされます。 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
次の例は、範囲の他のすべての要素を含む、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
次の例は、逆の反復に負のスキップ値を使用する方法を示しています。
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
Note
シーケンス式やその他の計算式で for...in
を使用できます。その場合は、カスタマイズされたバージョンの for...in
式が使用されます。 詳細については、「 シーケンス、 非同期式、 タスク式、 コンピュテーション式」を参照してください。
こちらも参照ください
.NET