Haskell бери и бросай одновременно

Мне было интересно, как я могу достичь:

Взяв первые n символов строки, затем ++ (объединив их с) отбросить эти первые n и взять следующие n и так далее (без сокращения слов). Я пробовал композицию функций и $, но единственное, что я получаю, это ошибки.

ИЗМЕНИТЬ

Я пытаюсь выровнять текст слева для заданной ширины столбца (n), поэтому я стараюсь не сокращать слова, но если есть слово под номером n , просто возьмите несколько символов перед ним, а затем используйте \n для запуска снова для следующей строки. Мои основные проблемы до сих пор заключаются в проверке условия сокращения слов (я могу использовать !!, но должен ли я использовать его в охранах с картой (-1) или как еще) и реализация рекурсии, потому что в качестве базы я получил

take n s ++ "\n" ++ take n (drop n s)

а также случай, когда n меньше самого длинного слова:

leftAlign n str = if n < ((maximum . map length . words) str) then "" else leftAlign n str

person Dimitar    schedule 13.06.2015    source источник
comment
Можете ли вы показать нам, что вы пытались и где вы застряли?   -  person utdemir    schedule 13.06.2015
comment
Я удалил ваше последнее предложение; слишком легко интерпретировать это как язвительный комментарий о Haskell и его практиках. В случае, если так и было задумано: больше так не делайте.   -  person Daniel Wagner    schedule 13.06.2015
comment
По подсказке чи: что именно означает без резких слов? Я еще не уверен, что понял вопрос.   -  person Daniel Wagner    schedule 13.06.2015
comment
Я пытаюсь выровнять текст слева для заданной ширины столбца, поэтому я стараюсь не сокращать слова, но если есть слово под номером n , просто возьмите несколько символов перед ним, а затем используйте \n, чтобы начать снова для следующего линия.   -  person Dimitar    schedule 14.06.2015
comment
@ user4325010 Определить слово; это может быть очевидно для вас, но слово — очень изменчивое понятие. Кроме того, вы уверены, что не хотите писать (простой) синтаксический анализатор для такого рода задач, вместо того, чтобы полагаться только на take и drop?   -  person jub0bs    schedule 14.06.2015
comment
@Jubobs Слова — это подстроки, разделенные пробелом (" \t\n"). Что ж, было бы интересно посмотреть на такую ​​реализацию парсера, и я обратился к take и drop только потому, что это было очевидно.   -  person Dimitar    schedule 14.06.2015
comment
Я думаю, что @Jubobs прав. В основном вам нужен синтаксический анализатор, состояние которого включает количество букв вместе со строкой.   -  person dfeuer    schedule 21.06.2015
comment
Отвечая на вопрос title: да, есть функция, которая отбрасывает и принимает одновременно: она называется splitAt. Также есть эквивалентная функция для dropWhile/takeWhile.   -  person SwiftsNamesake    schedule 16.07.2017


Ответы (1)


Data.List.Split.chunksOf делает это .

person Daniel Wagner    schedule 13.06.2015
comment
OP указан без сокращений, поэтому требуется немного больше внимания. - person chi; 13.06.2015