タプル(tuple)とは複数個のデータを一つとしてまとめたい時に使用する型です。
タームの集まりを中括弧({})で囲み、タームの間をコンマ(,)で区切ることで利用されます。
{Term1, . . . ,TermN}
タプルの中の要素の数は任意です。無くても構いません。
また、タプルの中にあるタームはどのような型でも構いません。つまり、タプルの中にタプルを入れたり、リストを入れたりしても構わないということです。
例えば、
{apple, orange, peach}
{adam, 24, {july, 29}}
{}
のようにものになります。
上記の例にあるように、タプルの中にタプルを入れることも可能です。
また、タプルの最初の要素に値を入れておくことで、そのタプルが何を表しているのかわかりやすくすることが多いです。
例えば、
{goods,{id,338},{name,apple},{price,200}}
というような具合です。
これはタプルを受け渡しする際に良く利用されます。
パターンマッチを使うことによってタプルから値を取り出すことができます。 これは非常によく使う手法ですので覚えておいて下さい。。
1> Goods = {338,apple,200}. {338,apple,200} 2> {Id,Name,Price} = Goods. {338,apple,200} 3> Id. 338 4> Name. apple 5> Price. 200
右辺のタプルの形に添って、左辺のタプルの中に変数が用意されていますね。 そして、右辺のタプルの中にある値と対応が取れる位置にある変数に欲しい要素が抽出されています。
タプルは要素の数で値を取り出します。したがって、要素数が合わないパターンマッチはエラーになってしまいます。
> Tuple = {1,2,{3,4},5}.
{1,2,{3,4},5}
> {A,B} = Tuple.
** exception error: no match of right hand side value {1,2,{3,4},5}
タプル自体もタームなので、そのまま変数に代入することもできます。
> A = Tuple.
{1,2,{3,4},5}
タプルの中に必要でない要素がある場合は無名変数「 _ 」を使います。 「_」を使うことによって無駄な変数への束縛を避ける(そのまま捨てる)ことができ、負荷を減らすことが可能です。 ただし、変数「_」から値を取り出すことは出来ません。
6> {Id2,_,Price2} = Goods.
{338,apple,200}
7> Id2.
338
8> Price2.
200
9> _.
* 1: variable '_' is unbound
また、「_」から始まる変数(_Num など)は特別な意味を持ちます。
関数を作る際に、通常の変数が利用されていないと注意されてしまいますが、「_」から始まる変数は注意されません。
従って、関数の中で「今は使わないけど、いずれ使うかもしれない」というような変数に利用されることが多いです。
> is_tuple({hello, [erlang, java]}).
true
> element(3,{hello, i, love ,erlang}).
love
> setelement(3,{i, like, erlang},{erlang, java}).
{i,like,{erlang,java}}
> tuple_size({1,2,3,4,5}).
5
> tuple_size({}).
0
erlang:append_element({one, two}, three).
{one,two,three}
> erlang:make_tuple(4,good).
{good,good,good,good}
> tuple_to_list({share, {'Ericsson_B', 163}}).
[share,{'Ericsson_B',163}]
> list_to_tuple([share, ['Ericsson_B', 163]]).
{share, ['Ericsson_B', 163]}