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
んー、こう?