Я парень, работающий на С#, и пытаюсь выучить Haskell из веб-трансляций Эрика Мейера на канале 9. Я наткнулся на интересную головоломку, в которой нужно было пропустить все n элементов списка с помощью zip и mod.
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
Я подумал, что было бы более эффективно (для действительно больших списков или потоков), если бы мы могли избежать использования мода.
Я подумал о ленивом создании повторяющегося списка целых чисел, чтобы мы могли просто сравнить значение 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
?