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