Я - парень на C #, пытаюсь научить себя Хаскеллу из трансляций Эрика Мейера на 9 канале. Я натолкнулся на интересную головоломку, которая включала пропуск всех 'n' элементов списка с использованием zip и мода.
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
?