Ах, как об этом?
val l = List(10,9,8,7,6,5,4,3,2,1,0)
for (i <- (0 to l.size - 1 by 3).toList) yield l(i)
//res0: List[Int] = List(10, 7, 4, 1)
, которые могут быть сделаны более общим по
def seqByN[A](xs: Seq[A], n: Int): Seq[A] = for (i <- 0 to xs.size - 1 by n) yield xs(i)
scala> seqByN(List(10,9,8,7,6,5,4,3,2,1,0), 3)
res1: Seq[Int] = Vector(10,7,4,1)
scala> seqByN(List(10,9,8,7,6,5,4,3,2,1,0), 3).toList
res2: Seq[Int] = List(10,7,4,1)
scala> seqByN(List[Int](), 3)
res1: Seq[Int] = Vector()
Но функциональной вы имеете в виду только с помощью различных функций Список комбинаторов? В противном случае, потоки достаточно функциональны?
def fromByN[A](xs: List[A], n: Int): Stream[A] = if (xs.isEmpty) Stream.empty else
xs.head #:: fromByN(xs drop n, n)
scala> fromByN(List(10,9,8,7,6,5,4,3,2,1,0), 3).toList
res17: List[Int] = List(10, 7, 4, 1)
Как вы определяете функционал? Для понимания приемлемы? Потоки? Итераторы? Или вы имеете в виду * только * функции комбинатора списка? – itsbruce
Я просто пытаюсь исключить процедурные ответы. Мои главные проблемы здесь - читаемость и лаконичность. – user833970
Тогда я думаю, что метод индексов om-nom-nom и первое, наивное для понимания в моем ответе оба квалифицируются. – itsbruce