我是一名 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
?