fugafuga.write

日々のログ

すごいH本 part6

今日もやっていき

タプル

  • 違う型の要素を格納して1つの値にする
  • サイズが固定
*Main> (1,3)
(1,3)
*Main> (3, 'a', "hoooo!!!")
(3,'a',"hoooo!!!")
  • サイズ2のタプルをペアという
  • サイズ3のタプルをトリプルという
  • 長さが同じでも違う型を含むタプルを違うものとして扱う
*Main> [(1,2),('a',4)]

<interactive>:20:3: error:
    • Could not deduce (Num Char) arising from the literal ‘1’
      from the context: Num t
        bound by the inferred type of it :: Num t => [(Char, t)]
        at <interactive>:20:1-15
    • In the expression: 1
      In the expression: (1, 2)
      In the expression: [(1, 2), ('a', 4)]
  • タプルは固定長
  • 要素の追加はできない
  • 要素数が1のタプルは存在しない

ペアを使う

-- ペアの1つ目の要素を返す
*Main> fst (1, 4)
1
-- ペアの2つ目の要素を返す
*Main> snd (2, 8)
8
  • fst, snd はペアにだけしか使えない

zip

  • 2つのリストを走査してペアのリストを作る
*Main> zip [1,2,3,4,5] ['a','b','c','d','e']
[(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]

リストの長さが違う場合は長い方のあまりが無視される

*Main> zip [1,2,3,4,5] ['a','b','c']
[(1,'a'),(2,'b'),(3,'c')]

無限リストも使える

*Main> zip [1..] [100..110]
[(1,100),(2,101),(3,102),(4,103),(5,104),(6,105),(7,106),(8,107),(9,108),(10,109),(11,110)]

直角三角形を見つける

*Main> let rightTriangles' = [ (a, b, c) | c <- [1..10], a <- [1..c], b <- [1..a], a^2 + b^2 == c^2, a + b + c == 24]
*Main> rightTriangles'
[(8,6,10)]
  1. 解の候補となる集合を用意
  2. 解にたどり着くために変換とフィルタリングをする

このパターンの解法が関数プログラミングでよく使われる

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る