Haskell タプルの取り扱い

個人開発したアプリの宣伝
目的地が設定できる手帳のような使い心地のTODOアプリを公開しています。
Todo with Location

Todo with Location

  • Yoshiko Ichikawa
  • Productivity
  • Free

スポンサードリンク

タプル

タプルはサイズ固定だが、違った型を収めることができる。

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)]