Я пытаюсь реализовать следующую функцию в 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]]
Ответ 1 · рейтинг 1 · Redu
Если предположить, что пустые списки появляются только в начале и никогда не появляются в середине, то один из подходов может заключаться в том, чтобы сначала найти способ сделать одно вращение, а затем повторить одно и то же действие 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 оборотов Подсказка: желательно без конкатенации тары. .