我是一名C#程序员,尝试通过Erik Meijer在Channel 9网站上的网络视频教程来自学Haskell。我遇到了一个有趣的难题,涉及使用zip和mod跳过列表中的每个'n'元素。
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
我一直在思考,如果我们能避免使用模(mod)运算符,在处理非常大的列表或流时就会更加高效。
我考虑过惰性地创建一个重复的整数列表,这样我们就可以简单地将 i 的值与 n 进行比较。
repeatInts :: Int -> [Int]
假设调用repeatInts 3
会无限返回[1,2,3,1,2,3,1,2,3,1,2,3,..]
。
鉴于此,我们可以重新定义every
如下:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
所以我的问题是:你会如何实现repeatInts
函数?