組 (F#)
組は、名前がなく、順序が指定された値のグループです。各値は、型が異なる場合もあります。
( element , ... , element )
解説
前の構文の各 element には、任意の式を使用できます。
例
組には、2 個組、3 個組などがあり、型が同じである場合と異なる場合があります。 次のコードに、いくつかの例を示します。
// Tuple of two integers.
( 1, 2 )
// Triple of strings.
( "one", "two", "three" )
// Tuple of unknown types.
( a, b )
// Tuple that has mixed types.
( "one", "1", "2.0" )
// Tuple of integer expressions.
( a + 1, b + 1)
個別の値の取得
次のコードに示すように、パターン一致を使用して、組の要素の名前へのアクセスおよび割り当てを行うことができます。
let print tuple1 =
match tuple1 with
| (a, b) -> printfn "Pair %A %A" a b
次のように、let バインディングで組のパターンを使用できます。
let (a, b) = (1, 2)
これにより、値 a および b が同時にバインドされます。 組の 1 つの要素のみが必要な場合は、ワイルドカード文字 (アンダースコア) を使用して、不要な変数の新しい名前が作成されないようにすることができます。
let (a, _) = (1, 2)
fst 関数および snd 関数はそれぞれ、組の最初の要素と 2 番目の要素を返します。
let c = fst (1, 2)
let d = snd (1, 2)
組の 3 番目の要素を返す組み込み関数は存在しませんが、次に示すように、簡単に記述できます。
let third (_, _, c) = c
一般に、組の個々の要素にアクセスするには、パターン一致を使用する方が便利です。
組の使用
次の例に示すように、組によって、関数から複数の値を返す便利な方法が提供されます。 この例では整数の除算を実行し、結果を丸めた値を組の最初のメンバーとして、組の 2 番目のメンバーとして剰余を返します。
let divRem a b =
let x = a / b
let y = a % b
(x, y)
組は、通常の関数構文が意味する関数の引数が暗黙でカリー化されないようにする場合に、関数の引数として使用することもできます。
let sumNoCurry (a, b) = a + b
関数 let sum a b = a + b を定義する通常の構文を使用すると、次のコードに示すように、関数への最初の引数を部分的に適用する関数を定義できます。
let addTen = sum 10
let result = addTen 95
// Result is 105.
組をパラメーターとして使用すると、カリー化が無効になります。 詳細については、「関数 (F#)」の「引数の部分適用」を参照してください。
組型の名前
組である型の名前を記述する場合は、* 記号を使用して要素を区切ります。 (10, 10.0, "ten") のように、int、float、および string で構成される組については、次のように型を記述します。
int * float * string
コンパイルされた組の形式
F# の組のみを使用し、これらの組を他の言語に公開していない場合で、なおかつ、Version 4 よりも前のバージョンの .NET Framework を対象としていない場合は、このセクションを無視できます。
組は、いくつかのジェネリック型のオブジェクトのいずれかにコンパイルされます。コンパイルされた組は、すべて Tuple という名前を持ち、アリティ、つまり、型パラメーターの個数でオーバーロードされます。 C# や Visual Basic などの他の言語から表示する場合や、F# の構成要素に対応していないツールを使用する場合は、組の型がこの形式で表示されます。 Tuple 型は .NET Framework 4 で導入されました。 .NET Framework の旧バージョンを対象とする場合は、F# コア ライブラリ 2.0 のバージョンの System.Tuple がコンパイラで使用されます。 このライブラリに含まれる型は、.NET Framework 2.0、3.0、および 3.5 のバージョンを対象とするアプリケーションにのみ使用されます。 .NET Framework 2.0 と .NET Framework 4 の F# コンポーネントの間のバイナリ互換性を確保するために、型の転送が使用されます。