Необычный шаблон в задачах Project Euler выглядит примерно так:
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)
где f - некоторая дорогостоящая для вычисления функция, которая возвращает положительные значения вплоть до некоторой неизвестной точки и после этого возвращает нули.
Мне нравится распараллеливать вещи, особенно когда параллельные коллекции Scala и .par
делают это так просто. Но в отсутствие ParStream лучшее, что я придумал, это:
val BATCH=1024
Stream.from(1,BATCH).flatMap(
i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)
, который не выглядит очень элегантным и чувствителен к выбору значения BATCH
(но может привести к четырехкратному улучшению скорости моего четырехъядерного процессора).
Есть предложения по более чистым способам достижения того же результата?