Tôi là một chàng trai C# đang cố gắng tự mình dạy Haskell từ các webcast trên Kênh 9 của Erik Meijer. Tôi bắt gặp một câu đố thú vị liên quan đến việc bỏ qua mọi thành phần 'n' của danh sách bằng cách sử dụng zip và mod.Làm thế nào để tạo danh sách lặp lại vô hạn trong Haskell?
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs [1..], i `mod` n == 0]
Tôi đã nghĩ rằng nó có thể hiệu quả hơn (đối với danh sách hoặc luồng thực sự lớn) nếu chúng tôi có thể tránh sử dụng mod.
Tôi nghĩ về việc tạo ra một danh sách các số nguyên lặp đi lặp lại để chúng ta có thể so sánh giá trị của i với n.
repeatInts :: Int -> [Int]
như vậy gọi repeatInts 3
lợi nhuận [1,2,3,1,2,3,1,2,3,1,2,3,..]
vô cùng tận.
Vì điều này, chúng ta có thể xác định lại every
như vậy:
every :: Int -> [a] -> [a]
every _ [] = []
every n xs = [x | (x,i) <- zip xs (repeatInts n), i == n]
Vì vậy, câu hỏi của tôi là: làm thế nào bạn sẽ thực hiện repeatInts
?
Cf. http://stackoverflow.com/questions/2026912/how-to-get-every-nth-element-of-an-infinite-list-in-haskell –