タプル
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"])