タプル (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# コンポーネントの間のバイナリ互換性を確保するために、型の転送が使用されます。