fugafuga.write

日々のログ

すごいH本 part32

あけおめ。今年もHaskellやっていきます。

キーから値へのマッピング

連想リストでキーと値のペアを作成できる。

phoneBook = 
  [("betty", "555-2938")
  ,("bonnie1", "334-8878")
  ,("bonnie2", "334-8878")
  ,("bonnie3", "334-8878")
  ,("bonnie4", "334-8878")
  ]

キーで値を検索する関数を実装する

findKey :: (Eq k) => k -> [(k, v)] -> v
findKey key xs = snd . head . filter (\(k, v) -> key == k) $ xs

キーが見つからない場合、クラッシュする。

*Main> findKey "bonnie2" phoneBook
"334-8878"
*Main> findKey "foooooo" phoneBook
"*** Exception: Prelude.head: empty list

ここで、Maybe型を使う。

findKey :: (Eq k) => k -> [(k, v)] -> Maybe v
findKey [] = Nothing
findKey key ((k,v):xs)
  | key == k  = Just v
  | otherwise = findKey key xs

基底部を定義し、リストをhead,tailに分け、再帰を使っている。 しかし、再帰より畳み込みのほうがわかりやすい。

findKey :: (Eq k) => k -> [(k, v)] -> Maybe v
findKey key xs = foldr (\(k, v) acc -> if key == k then Just v else acc) Nothing xs

実行結果

*Main> findKey "bonnie2" phoneBook
Just "334-8878"
*Main> findKey "foooooo" phoneBook
Nothing

所感

Nothingが初期値なのに気づかず少し悩んでしまった。

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

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

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