如何定义生成给定列表的所有旋转的旋转函数?
例如:旋转 [1,2,3,4] =[[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3]]
我写了一个可以重新排列顺序的shift函数
shift ::[Int]->[Int]
shift x=tail ++ take 1 x
Run Code Online (Sandbox Code Playgroud)
但我不知道如何生成这些新数组并将它们附加在一起.
我试图从头开始这样做,而不使用标准库之外的库.继承我的代码:
permutations :: [a] -> [[a]]
permutations (x:xs) = [x] : permutations' xs
where permutations' (x:xs) = (:) <$> [x] <*> split xs
split l = [[x] | x <- l]
Run Code Online (Sandbox Code Playgroud)
问题是这只产生一个非确定性计算的分支.理想情况下我想要
(:) <$> [x] <*> ((:) <$> [x] <*> ((:) <$> [x] <*> ((:) <$> [x] <*> xs)))
Run Code Online (Sandbox Code Playgroud)
但我找不到干净利落的方法.我想要的结果是这样的:
permutations "abc" -> ["abc", "acb", "bac", "bca", "cab", "cba"]
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
haskell ×2