A Nierzadko wzorca problemów Euler projektu wydaje się być czymś, co odpowiada:emulacji Scala ParStream
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)
gdzie f jest pewną funkcję drogi-to-obliczeniowej, która zwraca wartości dodatnie aż do jakiegoś nieznanego punktu, a zwraca zera po tym.
Ja lubię porównywać rzeczy, zwłaszcza gdy równoległe kolekcje Scali i .par
czynią to tak łatwo. Jednak w przypadku braku ParStream, najlepsze jakie wymyślić to:
val BATCH=1024
Stream.from(1,BATCH).flatMap(
i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)
który nie wydaje się bardzo elegancko i jest wrażliwy na wybór BATCH
wartości (ale mogą przynieść poprawę prędkości x4 na mój czterordzeniowy).
Wszelkie sugestie dotyczące czystszych sposobów osiągnięcia tego samego rezultatu?
Podane przykłady nie są równoważne: na przykład z 'val f = 15 - (_: Int)' i 'BATCH = 10' pierwszy daje 105, a drugi 95 –
@Luigi: Właśnie dlatego go zakwalifikowałem z "zwraca wartości dodatnie do ... i zwraca zera po tym". np. Działa z def f (x) = 0 max (15-x). – timday