タプル

Haskell には タプル(tuple)という型がある。Wikipedia によると、Python や ML(初耳!!)にもあるらしい。

Python や ML、Haskell といったいくつかのプログラミング言語は、このタプルを保持するデータ構造を有している。

タプル - Wikipedia

が、今まで使ったことがある言語にタプルはない。というわけで、タプルを使ってみよう。

fst, snd

1 番目の要素を返す fst と 2 番目の要素を返す snd という関数がある。

Hugs> fst ("1st", "2nd")
"1st"
Hugs> snd ("1st", "2nd")
"2nd"

ただ、この 2 つは要素が 2 つのタプルを引数にしなければダメっぽい。

Hugs> fst ("1st", "2nd", "3rd")
ERROR - Type error in application
*** Expression     : fst ("1st","2nd","3rd")
*** Term           : ("1st","2nd","3rd")
*** Type           : ([Char],[Char],[Char])
*** Does not match : (a,b)

じゃあ、3 つ以上の要素を持つタプルの場合はどうするのよ?ってことなんだけど、次のような関数を作る事でできる。例は 4 つの要素のタプルの場合。

from_quad i (a0, a1, a2, a3) = case i of
                                   0 -> a0
                                   1 -> a1
                                   2 -> a2
                                   3 -> a3

main = print $ from_quad 2 ("zero", "one", "two", "three") -- => "two"

わざわざこのような関数を用意するのは面倒くさい。タプルは基本的に2つの要素で使った方がいいのかな?

zip, unzip

zip は 2 つのリストの要素をまとめてタプルのリストを作成する。

Hugs> zip [1, 2, 3] ["one", "two", "three"]
[(1,"one"),(2,"two"),(3,"three")]

unzip はその逆。

Hugs> unzip [(1, "one"), (2, "two"), (3, "three")]
([1,2,3],["one","two","three"])
使いどころ

実際タプルはどのようなときに使うのだろうか?値がペアになっていると都合のよいもの、例えば 2 次元座標の座標だったり、複素数だったり。と思っていたら、複素数は基本の型で用意されている事が発覚。あとは、ハッシュみたいな感じかな、キーとバリューで。