Примерно так:
def lsplit(pos: List[Int], s: String): List[String] = pos match {
case x :: rest => s.substring(0,x) :: lsplit(rest.map(_ - x), s.substring(x))
case Nil => List(s)
}
(Справедливое предупреждение: не является хвостовой рекурсией, поэтому будет пропускать стек для больших списков; неэффективно из-за повторного отображения индексов и цепочек подстрок. Вы можете решить эти проблемы, добавив дополнительные аргументы и / или внутренний метод, который выполняет рекурсия.)