Haskell 循环列表列表

Haskell rotate list of lists

我正在尝试在 Haskell 中实现以下函数,它是一个递归遍历,它接收一个 Int 和一个列表列表 [[Int]] 并将内部列表的元素向右移动不改变列表的大小。我能够得到一个顺序正确的数字列表,但我无法将它们重新插入到它们正确的子列表中。

shift_right::Int->[[Int]]->[[Int]]

示例 #1:

shift_right 1 [[1,2,3],[4,5,6]] => [[6,1,2],[3,4,5]]

示例 #2:

shift_right 3 [[],[1],[2,3],[4,5,6]] => [[],[4],[5,6],[1,2,3]]

假设空列表只出现在开头而不出现在中间,那么一种方法可能是,首先找到一种方法进行一次旋转,然后重复相同的操作 nn 轮换。我想我们可以使用 mapAccumL 来达到这个目的。

m = [[],[1],[2,3],[4,5,6]]
s l = es ++ (rem ++ ls) : lss
      where
      (rem, (ls:lss)) = mapAccumL shifter [] fs
      shifter a bs    = ([last bs], a ++ (init bs))
      (es,fs)         = span (== []) l              -- split empties and fulls

λ> s m
[[],[6],[1,2],[3,4,5]]

λ> s [[],[6],[1,2],[3,4,5]] -- carry from previous answer
[[],[5],[6,1],[2,3,4]]

λ> s [[],[5],[6,1],[2,3,4]] -- carry from previous answer
[[],[4],[5,6],[1,2,3]]

所以现在...既然你根本没有尝试,你有责任想出一个代码来调用这个函数(或这个函数的一部分)nn 旋转 提示:最好不要连接空容器。