Я обрабатываю список строк, вы можете думать о них как о строках книги.
Когда строка пуста, она должна быть отброшена. Когда это заголовок, он «сохраняется» как текущий заголовок. Каждая «нормальная» строка должна генерировать объект со своим текстом и текущим заголовком.
В конце у вас есть список строк, каждая с соответствующим заголовком.
Ex:.
- Chapter 1
Lorem ipsum dolor sit amet
consectetur adipisicing elit
- Chapter 2
sed do eiusmod tempor
incididunt u
Первая строка - это заголовок, вторая строка должна быть отброшена, затем две строки сохраняются как абзацы, каждая с заголовком "Глава 1" И так далее. В итоге вы получите коллекцию, похожую на:
{"Lorem ipsum...", "Chapter 1"},
{"consectetur...", "Chapter 1"},
{"sed do...", "Chapter 2"},
{"incididunt ...", "Chater 2"}
Я знаю, что модель заголовка / абзаца не имеет смысла на 100%, но я упростил модель для иллюстрации проблемы.
Это моё итеративное решение:
let parseText allLines =
let mutable currentTitle = String.Empty
seq {
for line in allLines do
match parseLine line with
| Empty -> 0 |> ignore
| Title caption ->
currentTitle <- caption
| Body text ->
yield new Paragraph(currentTitle, text)
}
Первая проблема - я должен отбрасывать пустые строки, я делаю это с 0 |> ignore
, но для меня это выглядит довольно плохо. Как правильно это делать (без предварительной фильтрации списка)?
Хвосто-рекурсивная версия этой функции проста:
let rec parseText allLines currentTitle paragraphs =
match allLines with
| [] -> paragraphs
| head :: tail ->
match head with
| Empty -> parseText tail currentTitle paragraphs
| Title caption -> parseText tail caption paragraphs
| Body text -> parseText tail currentTitle (new Paragraph(currentTitle, text) :: tail)
Вопрос (ы):
- Есть ли существенная разница между двумя версиями
(Стиль / производительность / и т.д.)?
- Есть ли лучший подход для решения этой проблемы
проблема? Можно ли это сделать с помощью одного List.map?