Haskell中的所有列表轮换

Cod*_*ice 6 haskell functional-programming list

我有一个旋转列表的功能:

rotate :: [a] -> [a]
rotate [] = []
rotate (x:xs) = xs ++ [x]
Run Code Online (Sandbox Code Playgroud)

现在我想要一个函数,它给出一个包含有限列表的每个可能旋转的列表:

rotateAll :: [a] -> [[a]]
Run Code Online (Sandbox Code Playgroud)

在命令式语言中,我会做(像伪代码)

for i = 1 to length of list
  append list to rotateList
  list = rotate(list)
Run Code Online (Sandbox Code Playgroud)

当然,强制性思考可能无法帮助我找到解决这个问题的功能.我正在寻找一些如何解决这个问题的提示.

其他想法:

要解决这个问题,我有两个问题需要解决.首先,我需要重复旋转列表并将每个结果收集到一个列表中.所以第一个解决方案需要做类似的事情

rotateAll xs = [xs (rotate xs) (rotate (rotate xs)) (rotate (rotate (rotate xs))) ...]
Run Code Online (Sandbox Code Playgroud)

当然我不知道要做多少次.我会满意地无限地做到这一点然后take (length xs)用来获得我想要的有限数量的列表.这实际上证明了第二个问题:确定何时停止.我不知道使用take是否是解决问题的最有效或最优雅的方式,但是当我输入它并且应该工作时,它会浮现在脑海中.

附录: 现在我已经找到了两个解决方案或者提示.我很乐意欢迎任何其他更快或使用不同方法的解决方案.谢谢!

Nor*_*sey 7

使用预定义的功能Data.List!您可以使用四个函数调用,无递归和无rotate函数来获取所有旋转的列表.

您要求不要在此处发布完整的解决方案.对于那些想要查看它的人,可以在http://pastebin.com/atGiw1ig上找到完整的解决方案(一行代码).


Kar*_*elė 3

除了iterate之外,您还可以编写一个函数来生成 n 次旋转的列表。Case n=0 只会将输入包装在列表中,而 Case n=m+1 会将输入附加到 Case m 的结果中。尽管通常首选使用标准函数,但有时编写自己的解决方案也是健康的。