foldrが無限リストを扱えるというならできるはずだと思って書いてみた。
drop' n = foldr f [] . zip (trueWhile n) where trueWhile n = (replicate n True) ++ (repeat False) f (True, _) = id f (_ , x) = (:) x
(追記)foldr
に食わせる関数が2引数であることが分かった方が理解しやすい。
関数合成も少ない方が理解しやすい気がする。
名前はもちろん長い方が理解しやすい。
drop' n xs = foldr dropWhileTrue [] (zip trueThenFalse xs) where trueThenFalse = (replicate n True) ++ (repeat False) dropWhileTrue (b, x) xs = if b then xs else x : xs