ループ: for...in 式 (F#)

このループ構造は、列挙可能なコレクション (範囲表現、シーケンス、リスト、配列、または列挙型をサポートするその他の構成要素) のパターンと一致するかどうかの照合を反復処理するために使用されます。

for pattern in enumerable-expression do
   body-expression

解説

for…in 式は、列挙可能なコレクションの値に対してループ処理を実行する場合に使用されるため、他の .NET 言語の for each ステートメントと比較されることがあります。ただし、for…in は、コレクション全体に対する反復処理だけでなく、コレクションに対するパターン マッチもサポートしています。

列挙可能な式は、列挙可能なコレクションとして指定できます。また、.. 演算子を使用して、整数型の範囲として指定することもできます。列挙可能なコレクションには、リスト、シーケンス、配列、セット、マップなどがあります。IEnumerable を実装する型であれば使用できます。

.. 演算子を使用して範囲を指定する場合は、次の構文を使用できます。

start ..finish

また、次のコードに示すように、スキップと呼ばれるインクリメントを含む構文も使用できます。

start ..skip ..finish

整数の範囲と単純なカウンター変数をパターンとして使用する場合は、通常、反復処理ごとにカウンター変数が 1 ずつインクリメントされます。ただし、範囲にスキップ値を含めると、カウンター変数は、1 ずつではなく、スキップ値ずつインクリメントされます。

パターンで一致した値も本体式で使用できます。

次のコード例は、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 の範囲 (範囲の要素が 1 つおきに使用されます) でループ処理を行う方法を次の例に示します。

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

メモfor...in は、シーケンス式および他のコンピュテーション式で使用できます。その場合は、for...in 式のカスタマイズされたバージョンを使用します。詳細については、「シーケンス (F#)」、「非同期ワークフロー (F#)」、および「コンピュテーション式 (F#)」を参照してください。

参照

関連項目

ループ: for...to 式 (F#)

ループ: while...do 式 (F#)

その他の技術情報

F# 言語リファレンス