このループコンストラクトは、範囲式、シーケンス、リスト、配列、列挙型をサポートするその他のコンストラクトなど、列挙可能なコレクション内のパターンの一致を反復処理するために使用されます。
構文
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
次の例は、シーケンスをループする方法と、単純な変数ではなくタプル パターンを使用する方法を示しています。 この例では、シーケンス式で -> 演算子を使用します。これは、シーケンス式やその他の計算式の do yield の短縮形です。
->演算子を使用すると、値がシーケンスの一部になる式を指定できます。 詳細については、「 シーケンス と コンピュテーション式」を参照してください。
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