问题

如何编辑以下代码以使Haskell显示从用户旋转输入列表的所有可能性:

 rotate ::  Int -> [a] -> [a]
rotate n text = take (length text) (drop n (cycle text)) 
 

我假设要打印所有可能性,我们需要删除第一个元素X时间.其中X是输入列表的长度.

 circle ::  [a] -> [[a]]
circle text = take (length text) (drop (1) (cycle text))
 

我无法执行列表打印X次的操作.我在运行上面的代码时也有错误,它说明以下内容:无法将类型“a”与“[a]”匹配

我希望输出是这样的:

 circle "ab"
["ab","ba"]
 

  最佳答案

您可以避免对 length 的任何调用,以及对 cycle 的重复调用和对 drop 的更大参数的重复调用,而不是在有限输入列表中跳过任何其他 wise-flue 列表,将它们修剪为您期望的大小,丢弃后面的元素:

 circle xs = let trim ys = zipWith const ys xs
            in trim . map trim . iterate tail . cycle $ xs

*Main> circle "abc"
["abc","bca","cab"]
 

  相同标签的其他问题

listhaskellfunctional-programming