あけおめ。今年も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
が初期値なのに気づかず少し悩んでしまった。

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