#haskell #functional-programming
#haskell #функциональное программирование
Вопрос:
Привет, я новичок в Haskell, и мне было интересно, как мне выполнить итерацию по списку строк и добавить новую строку после определенного количества символов?
У меня есть такой список:
list1 = ["I", "am", "new", "to", "Haskell", "and", "I", "really", "want", "to", "learn", "it"]
и я хочу поместить новую строку после 10 или менее символов.
В одной строке не может быть более 10 символов, и слова нельзя разбивать.
Результат должен выглядеть следующим образом:
Я новичок в n Haskell и n я действительно n хочу n его изучить
Есть идеи, как это сделать??
Комментарии:
1. Я вижу, что это делается с помощью рекурсивной функции с 2 накопителями: 1 для отслеживания того, сколько символов было обработано с момента последнего перевода строки, и 1 для отслеживания оставшихся слов. Затем вы просто выполняете итерацию по словам, считая буквы в каждом. Если
(length word) - 10 > (length nextWord)
, добавьте новую строку.2. что вы уже пробовали? также: гарантируется ли, что ни одно слово не длиннее 10 символов?
Ответ №1:
Пара крайних случаев, которые вы не указали в своем вопросе
- Что произойдет, если слово длиннее 10 символов? Я собираюсь предположить, что word должен располагаться в отдельной строке
- Должны ли мы считать пробелы, которые идут между словами? Я собираюсь снова предположить, что да (даже если ваш пример, кажется, говорит об обратном).
Вот одно из таких решений. Идея состоит в том, чтобы начать с сопоставления всех слов с их длиной. Затем мы проверяем по одному слову за раз и смотрим, сможем ли мы добавить его в текущую строку, не переполняя эту строку.
splitLines :: Int -> [String] -> String
splitLines n = helper 0 . map (w -> (length w,w))
where
helper :: Int -> [(Int,String)] -> String
helper _ [] = ""
helper lineLength ((wordLength,word):ws)
| lineLength == 0 = word helper wordLength ws
| lineLength wordLength 1 > n = "n" word helper wordLength ws
| otherwise = " " word helper (lineLength wordLength 1) words
В GHCi:
ghci> splitLines 10 (words "I am new to Haskell and I really want to learn it")
"I am newnto Haskellnand Inreallynwant tonlearn it"