タプル型

タプルとは組のことです。 タプル型を用いることで、任意の型を組み合わせた型(型の積)を表現できます。 リストは、要素の個数が可変で、 リスト内の要素の型が同じでなければならないのに対し タプルは、要素の個数は固定で、 タプル内の要素の型は異なってもかまいません。 タプルの利点の一つに、タプル型の値を返す関数を書くことで 複数の値を返す関数を記述することができるという点があります。 タプル型は()の中にコンマ区切りで式を入れることで利用できます。
タプル型の値
(expr1,expr2,...,exprn)
タプルは、F#ライブラリのSystem.Tuple<_,...,_>の短縮形になっています。 (f#4.1 spec Glossary T touple type)
タプル型の値の例
//数値1と数値2からなる値
(1,2);;
//文字列helloと数値1からなる値
("hello",1);;
//数値1と数値2からなる値。曖昧でなければ括弧は省略できます
1,2;;
//数値1と数値2からなるタプルの値と、数値3からなる値
((1,2),3);;
//1要素のタプルは存在しない。これは単なる数値の1
(1);;
//中身がなければタプルではなくunit型の値
();;
タプル型の型は、各値の型を*でつなげた型となります。 また、タプル型がネストしている場合は、()でくくられます。
タプル型の型
> (1,2);;
val it : int * int = (1, 2)
> ("lucky",7);;
val it : string * int = ("lucky", 7)
> ((1,2),3);;
val it : (int * int) * int = ((1, 2), 3)
タプル型の値を参照する場合、 最初の要素の参照にはfst タプル 二番目の要素の参照にはsnd タプルとします。 また、3要素以上の値の参照には、後に説明するパターンマッチを利用します。
タプル型の値の参照
//tplの1つめの要素である1を参照
let tpl=(1,2) in fst tpl;;
//tplの2つめの要素である2を参照
let tpl=(1,2) in snd tpl;;
//3つめの要素である3を参照
let tpl3=(1,2,3) in let (a1,a2,a3)=tpl3 in a3;;
型として、タプルの要素数を扱いたい場合があるかもしれませんが 私が知ってる限りF#ではそういうことは出来ません。 タプルの要素数を数値で与えられるような型システムは 依存型(Dependent Type)を持っていると言えますが F#は依存型には対応していないからです。 そういうシステムとしては coqやagdaなどがあり、 これらは定理の証明をサポートするような使い方が出来ます。