Soy un chico de C# tratando de enseñarme a mí mismo Haskell de las transmisiones por Internet del Canal 9 de Erik Meijer. Me encontré con un rompecabezas interesante que implicaba omitir todos los 'n' elementos de una lista usando zip y mod.¿Cómo crear una lista infinitamente repetitiva en Haskell?
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
He estado pensando que podría ser más eficiente (por muy grandes listas o arroyos) si podríamos evitar el uso de mod.
Pensé en crear perezosamente una lista repetitiva de enteros para que simplemente podamos comparar el valor de i a n.
repeatInts :: Int -> [Int]
tal que llamar repeatInts 3
vuelve [1,2,3,1,2,3,1,2,3,1,2,3,..]
ad infinitum.
Teniendo en cuenta esto, podríamos redefinir every
así:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
Así que mi pregunta es: ¿cómo poner en práctica repeatInts
?
Cf. http://stackoverflow.com/questions/2026912/how-to-get-every-nth-element-of-an-infinite-list-in-haskell –