RWH 4章練習問題

休みに入ったので、その間に少しでもRWH読もう。

-- 6
groupBy_fold :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy_fold f xs = foldl' step [] xs
    where step acc y | null acc              = [[y]]
                     | f (head $ last acc) y = init acc ++ [ (last acc) ++ [y] ]
                     | otherwise             = acc ++ [[y]]

エレファントだなあ… 途中でData.ListのgroupByと結果を比較するのが面倒になったので、こんな関数を書いて手抜き。

import Data.List (groupBy)
groupBy_check :: (Eq a) => (a -> a -> Bool) -> [a] -> Bool
groupBy_check f xs = (groupBy f xs) == (groupBy_fold f xs)

見ての通り、それぞれを適用して、結果を比較するだけの関数。==を使うので制約Eq aを掛けてるけど、まあとりあえずは充分だし。

-- 7
any_fold :: (a -> Bool) -> [a] -> Bool
any_fold f xs = foldr step False xs
    where step x _ = f x
--any_fold f xs = foldr (\x y -> f x) False xs

7はとりあえずanyだけ書けた。foldl'での実装は無限リストを渡したときに不適。
思い切り間違えてる。あとで。あとで書いた。

any_fold f xs = foldr step False xs
    where step x y = (f x) || y

んー、こう?