I'm a C# guy trying to teach myself Haskell from Erik Meijer's Channel 9 webcasts. I came across an interesting puzzle which involved skipping every 'n' elements of a list using zip and mod.
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
I've been thinking it might be more efficient (for really large lists, or streams) if we could avoid using mod.
I thought about lazily creating a repeating list of integers so we can simply compare the value of i to n.
repeatInts :: Int -> [Int]
such that calling repeatInts 3
returns [1,2,3,1,2,3,1,2,3,1,2,3,..]
ad infinitum.
Given this, we could redefine every
like so:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
So my questions is: how would you implement repeatInts
?