foldrでdrop

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