タプル
タプルはサイズ固定だが、違った型を収めることができる。
ghci> (1, 3) (1,3) ghci> (1, 'a', "Hello") (1,'a',"Hello")
サイズが違ったタプルは違った型として解釈する。
ghci> [(1,3),(4,5,6)] <interactive>:103:8: error: • Couldn't match expected type ‘(a, b)’ with actual type ‘(Integer, Integer, Integer)’ • In the expression: (4, 5, 6) In the expression: [(1, 3), (4, 5, 6)] In an equation for ‘it’: it = [(1, 3), (4, 5, 6)] • Relevant bindings include it :: [(a, b)] (bound at <interactive>:103:1) ghci> [(1,3,5),(4,5,6)] [(1,3,5),(4,5,6)]
ペアのみに作用する関数
fst
1つ目の要素を返す
ghci> fst (3, 4) 3 ghci> fst (3, 4, 5) <interactive>:108:5: error: • Couldn't match expected type ‘(a, b0)’ with actual type ‘(Integer, Integer, Integer)’ • In the first argument of ‘fst’, namely ‘(3, 4, 5)’ In the expression: fst (3, 4, 5) In an equation for ‘it’: it = fst (3, 4, 5) • Relevant bindings include it :: a (bound at <interactive>:108:1)
snd
2つ目の要素を返す
ghci> snd (3, 4) 4
zip
zip関数は2つのリストからペアを生成する。
ghci> zip [1,2,3] ['a', 'b', 'c'] [(1,'a'),(2,'b'),(3,'c')]
リスト内包表記でタプルを作成する
すべての組み合わせのトリプルタプルを生成する。とてもオシャレ。
ghci> [(a, b, c) | a <- [1..3], b<- ['a'..'c'], c <- [7..9]] [(1,'a',7),(1,'a',8),(1,'a',9),(1,'b',7),(1,'b',8),(1,'b',9),(1,'c',7),(1,'c',8),(1,'c',9),(2,'a',7),(2,'a',8),(2,'a',9),(2,'b',7),(2,'b',8),(2,'b',9),(2,'c',7),(2,'c',8),(2,'c',9),(3,'a',7),(3,'a',8),(3,'a',9),(3,'b',7),(3,'b',8),(3,'b',9),(3,'c',7),(3,'c',8),(3,'c',9)]
リンク
リンク