如何在无限列表上实现旋转功能?

How to implement rotate function on infinite lists?

我尝试实现 rotate 函数,它可以处理无限列表。我对 infinite lists 有疑问。

我的函数是:

cyclicRotation:: Int -> [a] -> [a]
cyclicRotation num ls = (drop ((length ls) - (mod num (length ls)))  ls) ++ ( take ((length ls) -(mod num (length ls))) ls)

我尝试将我的函数用作:

take 2 (cyclicRotation 9 [1..])

我想得到 [10, 11]

为了使用无限列表,您需要避免对其进行非惰性评估函数(例如长度)。简单的示例实现是:

rotate :: Int -> [a] -> [a]
rotate _ [] = []
rotate 0 list = list
rotate n (x:xs) = rotate (n-1) (xs ++ [x])

此处 (xs ++ [x]) 甚至可以用于无限列表,因为 ++ 是惰性的。