Scala: итерация / накопление списка для целочисленного диапазона

Я новичок в Скале. Я пытаюсь сделать следующее:

def foo(n: Int): List[Int] = {
  def worker(i: Int, acc: List[Int]): List[Int] = {
    if (i == 0) acc
    else worker(i - 1, compute(i) :: acc)
  }
  worker(n, List[Int]())
} 
  • foo повторяется от 0 до n
  • Для каждой итерации он обновляется / накапливается в неизменяемом списке.

То, что я хочу сделать, это выразить более кратко, используя что-то вроде foldLeft,

Если foo перебирает List, функции преобразования высокого порядка, такие как map а также reduceLeft может быть использован. Я могу использовать такие функции, но хочу знать, есть ли более элегантный способ решения таких задач.

Соответствующий код в C++ будет выглядеть так:

list<int> foo(int n) {
  list<int> result;
  for (int i = 0; i < n; ++i)
    result.push_back(compute(i));
  return result;
}

1 ответ

Решение

Как насчет:

def foo2(n: Int) = (1 to n).foldLeft(List[Int]())((l,i) => l :+ compute(i))

или даже:

def foo2(n: Int) = (1 to n).foldLeft(List[Int]())(_ :+ compute(_))
Другие вопросы по тегам