Is there a built-in function to get all consecutive subsequences of size n of a list in Haskell?

haskell

Solution

You could use `tails`:

gather n l = filter ((== n) . length) $ map (take n) $ tails l

or using `takeWhile` instead of `filter`:

gather n l = takeWhile ((== n) . length) $ map (take n) $ tails l

EDIT: You can remove the filter step by dropping the last `n` elements of the list returned from `tails` as suggested in the comments:

gather n = map (take n) . dropLast n . tails
  where dropLast n xs = zipWith const xs (drop n xs)

Problem

For example, I need a function: ``` gather :: Int -> [a] -> [[a]] gather n list = ??? ``` where `gather 3 "Hello!" == ["Hel","ell","llo","ol!"]`. I have a working implementation: ``` gather :: Int-> [a] -> [[a]] gather n list = unfoldr (\x -> if fst x + n > length (snd x) then Nothing else Just (take n (drop (fst x) (snd x)), (fst x + 1, snd x))) (0, list) ``` but I am wondering if there is something already built into the language for this? I scanned Data.List but didn't see anything.

Original source