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]]
假设空列表只出现在开头而不出现在中间,那么一种方法可能是,首先找到一种方法进行一次旋转,然后重复相同的操作 n
次n
轮换。我想我们可以使用 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]]
所以现在...既然你根本没有尝试,你有责任想出一个代码来调用这个函数(或这个函数的一部分)n
次 n
旋转 提示:最好不要连接空容器。
我正在尝试在 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]]
假设空列表只出现在开头而不出现在中间,那么一种方法可能是,首先找到一种方法进行一次旋转,然后重复相同的操作 n
次n
轮换。我想我们可以使用 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]]
所以现在...既然你根本没有尝试,你有责任想出一个代码来调用这个函数(或这个函数的一部分)n
次 n
旋转 提示:最好不要连接空容器。