У меня есть список строкЕсть ли комбинатор для этого?
val allLines = List("James Bond", "secret agent", "", "Martin Odersky")
я тогда хочу «карта», что, например, a List[Person]
, где case class Person(name: String, moreDetails: List[String]
с использованием несколько элементов сразу.
val people = allLines.someCombinatorFunction { lines =>
val name = lines.head
val (moreDetails, remainingLines) = lines.span(_ != "")
val person = Person(name, moreDetails)
(person, remainingLines)
}
это должно дать мне:
List(Person("James Bond", List("secret agent")), Person("Martin Odersky", Nil))
Ie. Я хочу взять переменные числовые строки, объединить их с Лицом и «передать» оставшиеся строки. List[String] => List[Person]
. Это тривиально с помощью рекурсии:
def linesToPeople(lines: List[String]): List[Person] = { lines =>
val name = lines.head
val (moreDetails, remainingLines) = lines.span(_ != "")
val person = Person(name, moreDetails)
person :: linesToPeople(remainingLines)
}
... но !, рекурсия дорого, если вы не сделаете его хвостовой рекурсией ..:
def linesToPeople(lines: List[String], acc: List[Person] = Nil): List[Person] = { lines =>
val name = lines.head
val (moreDetails, remainingLines) = lines.span(_ != "")
val person = Person(name, moreDetails)
linesToPeople(remainingLines, person :: acc)
}
^Это где она становится слишком громоздким имо. Вы также должны сделать .reverse
в конце, чтобы получить заказ. Комбинатор бы неплохо здесь
Так поясню, у меня есть список, я хочу «потреблять» & объединить переменное число его элементов, и вернуть останки. Есть ли способ сделать это, не прибегая к рекурсии?
Разделителя между строками, которые должны быть использованы для одного человека является пустой строкой '«»' в списке (или конец списка)? Я не думаю, что для этого есть готовая функция. – Jesper
Если вы попытаетесь об этом подумать ... почти каждый потребитель - 'look -> study -> Consume -> снова начать с рекурсии отдыха. –
Да! Это настолько распространено, что для этого есть * комбинатор? – kornfridge