Вращение списка в Haskell со всеми возможностями - PullRequest
0 голосов
/ 26 сентября 2019

Как я могу отредактировать следующий код, чтобы заставить Haskell показать все возможности поворота списка ввода от пользователя:

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

Я предполагаю, что для печати всех возможностей нам нужно отбросить первый элементХ раз.где X - длина введенного списка.

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

Я не могу выполнить операцию, когда список печатается X раз.Кроме того, у меня есть ошибки при запуске приведенного выше кода, который гласит следующее: Не удалось сопоставить тип 'a' с '[a]'

Я хотел, чтобы вывод был примерно таким:

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

Ответы [ 3 ]

5 голосов
/ 27 сентября 2019

Вы можете избежать любых вызовов к length, а также повторных вызовов к cycle и еще более широких аргументов к drop, вместо этого сжав любые бесконечно бесконечные списки с конечным входным списком, чтобы обрезать ихбыть ожидаемого размера, отбрасывая более поздние элементы:

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

*Main> circle "abc"
["abc","bca","cab"]
0 голосов
/ 26 сентября 2019

Я бы начал с повторного использования функции rotate и применил бы некоторую рекурсию:

circle text = text : (circle $ rotate text)

Теперь это создает бесконечный список.Если вы хотите, чтобы каждый поворот выполнялся только один раз, используйте take:

circle text = take (length text) $ text : (circle $ rotate text)

. Эта версия имеет недостаток в расчете длины text каждый раз, когда вы вызываете circle.Вместо этого вы можете использовать вспомогательную функцию со счетчиком, который уменьшается для каждой рекурсии:

circle = circle' (length text)
  where circle' 0 _ = []
        circle' n text = text : (circle' (rotate text) (n - 1))
0 голосов
/ 26 сентября 2019

Похоже, вы заинтересованы во всех перестановках всех перестановок.Это означает, что вы имеете дело с [ [] ] - списком (напомните, что "ab" - это просто ['a', 'b']).Data.List имеет то, что вам нужно. Исходный код .В противном случае я полностью неправильно понял ваше намерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...