我是一个C#的家伙,试图从Erik Meijer的Channel9网络广播中自学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,..] ad。
鉴于此,我们可以像这样重新定义every:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]所以我的问题是:如何实现repeatInts?
发布于 2010-01-10 08:11:14
使用cycle
cycle ::a -> a
cycle将一个有限列表绑定到一个循环列表中,或者等价地,将原始列表无限重复。它是无穷列表上的恒等式。
您可以用cycle来定义repeatInts
*Main> let repeatInts n = cycle [1..n]
*Main> :t repeatInts
repeatInts :: (Num t, Enum t) => t -> [t]
*Main> take 10 $ repeatInts 3
[1,2,3,1,2,3,1,2,3,1]好奇的是,GHC实现了cycle:
cycle [] = errorEmptyList "cycle"
cycle xs = xs' where xs' = xs ++ xs'在纯函数的说法中,这种奇怪的技术称为结,它创建的是循环数据结构,而不是无限数据结构。
有关详情,请参阅
[tying-the-knot]发布于 2014-05-10 20:38:38
回答晚了,但也可以这样写:
repeatInts :: Int -> [Int]
repeatInts 0 = []
repeatInts a = [1..a] ++ repeatInts ahttps://stackoverflow.com/questions/2035432
复制相似问题