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.