34
I don't have anything to test this with at work, but something like:
extractEvery m = map snd . filter (\(x,y) -> (mod x m) == 0) . zip [1..]
should work even on infinite lists.
(Edit: tested and corrected.)
An uglier, and more limited version of the accepted answer
every :: Eq a => Int -> [a] -> [a]
every n xs = if rest == []
then []
else head rest : every n (tail rest)
where rest = drop (n-1) xs
For "line golfing" it can be written like this:
every n xs = if rest == [] then [] else head rest : every n (tail rest)
where rest = drop (n-1) xs
(It's more limited because it has an unnecessary Eq a constraint.)