Как выполнить итерацию по списку строк и добавить новую строку после определенного количества символов в Haskel?

#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"