如何在无限列表上实现旋转功能?
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])
甚至可以用于无限列表,因为 ++
是惰性的。
我尝试实现 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])
甚至可以用于无限列表,因为 ++
是惰性的。