読者です 読者をやめる 読者になる 読者になる

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

Modules

Haskell

今日は,「Learn You a Haskell for Great Good!」の
7. Modules
を斜め読みしてます。まだ読みかけです。

Data.Mapのところが面白くもあり,難しくもあります。
例えば,

phoneBook =
    [("betty", "555-2938")
    ,("bonnie", "452-2928")
    ,("patsy", "493-2928")
    ,("lucille", "205-2928")
    ,("wendy", "939-82822")
    ,("penny", "853-2492")
    ]

のとき,

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

なら,分かりやすいのですが、

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

になると難しいです…。っが,面白いです。
foldlの練習も兼ねて,

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

と書いてみたりしました。
最後に,scanlの練習も兼ねて,

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

と書いてみました。findKey1は自分でも思いつきそうですが,それ以外の書き方はすごいなぁと思います。

Main> findKey4 "wendy" phoneBook
[Nothing,Nothing,Nothing,Nothing,Nothing,Just "939-82822",Just "939-82822"]