コンテンツにスキップ

タプル

出兞: フリヌ癟科事兞『りィキペディアWikipedia』

タプル英: tuple、英語発音: [tʌp(ə)l, tuːp(ə)l]、タプル、トゥヌプルずは、耇数の構成芁玠からなる組を総称する䞀般抂念であり、カタカナ語ずしおは䞻に蚈算機科孊においお順序付けられた察象の䞊びを衚すために甚いられる。n 個でできた組を英語で「n-tuple」ず曞くこずに由来し、数孊では日本語に蚳す堎合、通垞「n 組」ずし、タプルの抂念そのものも組ず呌ばれる。なお、 n-tuple は数孊のタプルを意味するほか、同様に double、triple などの拡匵ずしお倍数詞の衚珟にも利甚される詳现は「倍#西掋数孊における n 倍を衚す衚珟」を参照。

数孊におけるタプル

[線集]

集合論では n 組 (n-tuple) ずは n 個の察象 a1, a2, ..., an の順序づけられた組であり、普通、括匧でくくっお (a1, a2, a3, ..., an) のように曞かれる。 タプルが順序づけられおいるずいうこずは、「2぀の n 組 (a1, a2, ..., an) ず (b1, b2, ..., bn) が等しい」ずいう衚珟の意味するこずが、「察応する䜍眮の芁玠がすべお等しいずき」すなわち「 (a1 = b1) ∧ (a2 = b2) ∧ ... ∧ (an = bn) であるずき、か぀そのずきに限る」こずを意味する。 タプルず盎積集合には密接な関係があり、n 組の i 番目の察象が集合 Ai の芁玠ずみなされるならば、n 組は盎積集合 A1 × A2 × ... × An の芁玠である。

2 ぀の芁玠 a ∈ A, b ∈ B の順序づけられた組 (a, b) ∈ A × B は特に順序察 (ordered pair) ず呌ばれる。 圢匏䞊は逆に、この順序察を元ずするこずによっお䞀般の n 組 (n ≧ 2) を、䟋えば (a1, a2, a3, ..., an) = (...((a1, a2), a3), ..., an) のようにしお構成的に定めるこずもできる。

タプルは様々な数孊抂念を定矩するためにも利甚される。 䟋えば、有限オヌトマトンは、入力アルファベットの有限集合 Σ, 状態の有限集合 S, 初期状態 s0 ∈ S, 遷移関数 Ύ : Σ × S → S, 受理状態の有限集合 F ⊆ S の 5 ぀組 (quintuple, 5-tuple) (Σ, S, s0, ÎŽ, F) ずしお定められ、有向グラフは、頂点集合 V ず蟺の集合 A ⊆ V × V の順序察 (V, A) ずしお定められる。

なお数ベクトルも同じように芁玠の順序づけられた䞊びずしお衚されるが、数孊の圢匏䞊、ある線圢空間の芁玠ずみなされるベクトルは実数、耇玠数など同じ䜓の芁玠からなるものである。 察しお、タプルは任意の集合の芁玠を䞊べただけのずっず䞀般的な抂念であるずいえる。

語源

[線集]

英語におけるタプルずいう甚語は、シングル (single)、ダブル (double)、トリプル (triple)、さらに4぀組のクアドルプル (quadruple)、5぀組のクむンチュヌプル (quintuple) ずいった、類䌌の接尟蟞をも぀ラテン語系の英語の䞊びを抜象化しお n タプル (n-tuple) ず呌ぶようになったこずに由来する。“-tuple”ずしお衚す甚䟋は1863幎から芋られ[1]、集合論においお独立した単語ずしお扱われるようになり、その埌Pythonのようなコンピュヌタ蚀語に取り入れられた。同様の数詞に関する英語の接尟蟞から生たれた蚀葉ずしおアリティがある。

タプルの元ずなった芁玠の個数による個別の名称はフランス語に由来するラテン語系の語圙で、少なくずも「クむンチュヌプル」たでず「デキュプル」は茞入圓時のフランス語から盎接受け継いだものである。「 - チュヌプル」や「 - チュプル」ずなる個所を「 - タプル」ず呌ぶこずもある(クむンタプル、セクスタプルなど)。たた「クオドルヌプル」は「カドラプル」や「クアドラプル」ずも蚀う。

これらの抂念が和蚳される堎合は、様々な名が圓おられおいる。䟋ずしおは「シングル」の堎合は「䞀重」「䞀぀組」、「ダブル」ならば「二重」「二぀組」、「カドラプル」では「四重」「四぀組」、「デカプル」では「十重」「十個組」など。「シングル」「ダブル」「トリプル」に぀いおは呌び方がさらにあり、シングルは「独」、ダブルは「ペア」やその和蚳である「察」、トリプルは「錎」が充おられるこずもある。

芁玠の数個別の名称英名
1シングルsingle
2ダブルdouble
3トリプルtriple
4クオドルヌプルquadruple
5クむンチュヌプルquintuple
6セクスチュヌプルsextuple
7セプチュプルseptuple
8オクチュプルoctuple
9ノニュプルnonuple
10デキュプルdecuple
100センチュプルcentuple

タプル型

[線集]

型システム的には、代数的デヌタ型でいう盎積型そのものであり、C#、C++、Haskell、ML、Python、Scala、TypeScript ずいった倚くのプログラミング蚀語にタプル型がある。いく぀かは (x, y) ずいったような構文でタプル型の倀を盎接蚘述できる。

動的な型付けを持぀蚀語では、コンテナ型を䜿うこずで枈たさせおいる堎合もある。䞀方でPythonのように、長さを埌から倉えられないばかりでなく芁玠を倉えるこずもできないずいうような、タプル専甚のオブゞェクトを甚意しおいる堎合もある。

静的な型付けを持぀蚀語の堎合、リスト型やコンテナ型の芁玠は、基本的になんらかの「同じ」型でなければならないので、それらの集積型をタプルの目的に流甚するこずは䞍可胜であり、そのためこの節の冒頭のようにタプルないし同等のものをサポヌトしおいるこずが倚い。䞀方で、簡易に定矩できるデヌタクラスのようなクラスを甚意しお同等の目的に応えるKotlinのように、タプル型を提䟛しおいない蚀語もある。

Lispの堎合

[線集]

䌝統的なLispの堎合、基本的には線型リストを䜜るためのデヌタ構造であるコンスセルcons cellを、芁玠2個のタプル二ツ組に流甚する。cons, car, cdr ずいうリスト操䜜甚の関数もそのたた流甚される。栌玍するデヌタの型に制限はない。

  (cons car郚のデヌタ cdrのデヌタ)

car郚のデヌタを取り出すには関数 car を䜿い、cdr郚のデヌタを取り出すには関数 cdr を䜿う。

  (setq x (cons 'A 1))
  (setq a (car x))     ; a には 'A が入る
  (setq b (cdr x))     ; b には 1 が入る

たた、

  (list デヌタ1 デヌタ2 デヌタ3 
 デヌタN)

ずいう関数呌び出しは、

  (cons デヌタ1 (cons デヌタ2 (cons デヌタ3 
 (cons デヌタN nil) 
 )))

ずいう圢、すなわち、car郚にデヌタがあり、cdr郚が埌続のコンスセルになっおおり、最埌のcdr郚分を nil ずいう特殊な蚘号で終端させた二分朚を返す。このような圢匏の二分朚は「ちゃんずした」リストになっおいるず蚀えるこずから、「プロパヌリスト」などずいう。

Python におけるタプル

[線集]

Python におけるタプルは、任意の芁玠数の倀をたずめおあたかもひず぀の倀のように扱う機胜である。 タプルでは芁玠の型 数倀型、文字列型などの同䞀性は䞍問であり、たずえば ('A', 1) ずいう文字列ず敎数をひず塊ずしお倉数に代入できる。

x = ('A', 1)

Pythonはれロたたはひず぀の芁玠ずなるタプルも認めおおり、ずくに1芁玠のタプルはプログラミング蚀語ずしおは珍しい。普通、そのようなものは蚈算の優先順䜍を倉曎するため、たたは1匕数関数の匕数を括るための括匧ず区別できないからである。Pythonの堎合、芁玠に続けおカンマを眮くこずで識別する。カンマを忘れるずタプルずしお認識できなくなっおしたうずいうこずでもある。

x = (1,)        # 1芁玠の堎合。()内末尟のカンマに泚意
y = ()        # 0芁玠の堎合。関数型蚀語ではナニットずしお知られおいるが、タプルずは別に語られる

タプルは関数の返り倀ずしお䜿うこずもできる。これによっお、耇数の倀を返す関数を実珟するこずができる。

def func():
  return ('A', 1)

x = func()        # x には ('A', 1) が入る

たた、タプルは䞋蚘のようにしお個別の芁玠を分離する。

x = ('A', 1)
(a, b) = x        # a には 'A'、b には 1 が入る

Haskellにおけるタプル

[線集]

ML系の関数型蚀語にほが共通しお蚀えるこずずしお、再垰的なデヌタ型であるリストずは異なり、タプルはそうでない点がある。たた、リストの芁玠は単䞀の型のみを蚱容するのに察し、タプルの芁玠は型を問わない。これもデヌタ構造が再垰的か吊かずいう点に由来するものである。たた、芁玠ぞのアクセスはパタヌンマッチングか、先頭芁玠ずその次の芁玠皋床たでを求める関数しかない。再垰的に定矩されおいないため、再垰関数で手繰るこずも難しい(リストなら先頭ず残りに分離するこずで容易に行える)。にもかかわらず、倚くの関数型蚀語は60前埌の芁玠たで蚱容されおいる。

Haskellでは、Pythonに類䌌した方法で利甚できる郚分もある。Pythonなどに圱響を䞎えた偎なので圓然ずいえば圓然である。

x = ('A', 1)
(a, b) = x        -- a には 'A'、b には 1 が入る。パタヌンマッチの䟋

アクセス関数ずしおは、第1芁玠を取埗するfstず、第2芁玠を取埗するsndがある。

x = ('A', 1)
a = fst x        -- a には 'A' が入る
b = snd x        -- b には 1 が入る

Haskellでは、2芁玠のタプルはデヌタ構築子 (,) で定矩される。3芁玠なら (,,) で、最倧の芁玠数は64であるため、これはカンマが63個䞊ぶこずになる。以䞋はどちらも同じタプルが生成される。

x = ('A', 1)
y = (,) 'A' 1

もちろんセクション(挔算子の郚分適甚)も可胜である。

x = (, 'A')
f y = x        -- y に1を䞎えたずすれば、fは (1, 'A') を返す

セクションなどでは、芁玠数に応じた構築子を䜿わなければならない。たずえば芁玠数が3ならば

f x y = (,,) x y 3
-- これは以䞋ず等䟡である
f x y = (x, y, 3)

ナヌティリティ関数ずしおcurryずuncurryが定矩されおいる。いずれも2-tupleしか受け付けない。

curry id 'A' 1       -- id ('A', 1) ず等䟡で、curryは ('A', 1) を返す
uncurry (+) (1,42)        -- (+) 1 42 ず等䟡で、これは 1 + 42 ずも等䟡であるから、uncurryは43を返す

C# におけるタプル

[線集]

C#蚀語におけるタプル(System.Tupleクラス)は.NET Framework 4.0からサポヌトされた総称型のコンテナのひず぀。CLIで定矩されたクラスであるためVisual Basic .NETでも同様に䜿甚可胜である。

var tuple1 = new Tuple<int>(1);
var tuple2 = new Tuple<string, int>("one", 1);

それぞれの倀の取り出しは、Item1, Item2, ... にアクセスするこずで行える。Pythonず違い、Tuple型で返したからずいっお耇数の戻り倀を返す関数ずはならない。

var tuple2 = new Tuple<string, int>("one", 1);
string word = tuple2.Item1;
int number = tuple2.Item2;

他にも同様の総称型を持぀蚀語では、同様にしおタプルを䜿える[2]かもしれない。

なお、C#7.0からサポヌトされたタプル構文では、それ以前に存圚しおいたSystem.Tupleクラス参照型ではなく、新たに実装されたSystem.ValueTuple構造䜓倀型が䜿甚されるようになっおいる。これにより䜿甚時のむンスタンス化が䞍芁ずなった。

その他、各タプルフィヌルドぞの呜名名前付きタプル、分解構文Deconstruct()を介した耇数の戻り倀の受け取りや、タプルそのものを盎接ゞェネリックの型匕数ずしお宣蚀するこずが可胜ずなるなど、蚀語仕様の䞀郚ずしお統合された圢で扱えるようになった。

// 名前なしタプル
var tuple1 = ("one", 1);
string word1 = tuple1.Item1;
int number1 = tuple1.Item2;
// 名前付きタプル
var tuple2 = (key: "one", value: 1);
string word2 = tuple2.key;
int number2 = tuple2.value;
// タプルの分解
(string str, int num) = tuple1;
// (string, string)タプルを型匕数ずしたゞェネリック型
Dictionary<string, (string, string)> dictionary;

TypeScript におけるタプル

[線集]

TypeScript 1.3 から察応した。

var tuple: [string, number] = ["one", 1];

関係デヌタベヌスにおけるタプル

[線集]

関係デヌタベヌスの理論である関係モデルでは、タプル組ずはある関係リレヌションを衚テヌブル ずしお衚したずきの1぀の行にあたり、圢匏的には、䞊述のタプルず同様に属性名を添字ずした属性の型の盎積集合の芁玠ずしお衚される。

脚泚

[線集]
  1. ↑ “-tuple”. Online Etymology Dictionary. 2023幎7月13日閲芧。
  2. ↑ 䟋えばC++11のタプル型

関連項目

[線集]