2016-10-23 2 views
0

Hy, я новичок в Haskell и задавался вопросом, как следует перебирать список строк и добавлять новую строку после определенного количества символов?Как перебирать список строк и добавлять новую строку после определенного количества символов в Haskel?

У меня есть такой список:

list1 = ["I", "am", "new", "to", "Haskell", "and", "I", "really", "want", "to", "learn", "it"] 

и я хочу поставить символ новой строки после 10 или менее символов.

В одной строке не может быть более 10 символов, а слова не могут быть разделены.

Вывод должен выглядеть следующим образом:

Я новичок в \ п Haskell и \ п я действительно \ N хотите \ п узнать его

Любые идеи, как это сделать ??

+0

Я могу видеть это делается с помощью рекурсивной функции с 2-х аккумуляторов: 1, чтобы отслеживать, сколько символов было обработано с последней строки, и 1, чтобы отслеживать оставшиеся слова. Затем вы просто перебираете слова, считая буквы в каждом. Если '(слово длины) - 10> (length nextWord)', добавьте новую строку. – Carcigenicate

+3

что вы пробовали? также: гарантировано ли, что ни одно слово не длиннее 10 символов? – mb21

ответ

1

Пара крайних случаев вы не указали в своем вопросе

  • Что произойдет, если слово длиннее 10 символов? Я собираюсь предположить, что слово должно идти по собственной линии
  • Должны ли мы считать пробелы между словами? Я снова собираюсь принять «да» (даже если ваш пример, похоже, говорит об обратном).

Вот одно из таких решений. Идея состоит в том, чтобы начать с отображения всех слов с их длиной. Затем мы проверяем одно слово за раз и видим, можем ли мы добавить его в текущую строку, не переполнив эту строку.

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 new\nto Haskell\nand I\nreally\nwant to\nlearn it"