この問題はエラトステネスのふるいですね。ScalaではArrayを使うとよいと思います。配列ですね。
val a = new Array[Int](5) for(i <- 0 to 4) a(i) = i + 1 println (a(1)) // 2 println (a.toList) // List(1, 2, 3, 4, 5)
[]の代わりに()を使うくらいですね。簡単です。
def sieve(N :Int) = { val a = new Array[Boolean](N) for(n <- 2 to (N - 1)) a(n) = true for(p <- 2 to (N - 1) if a(p); m <- (p * 2) to (N - 1) by p) a(m) = false (2 to (N - 1)).filter(a(_)) } val N = 2e6.toInt println (sieve(N).map(_.toLong).sum)
ところで、上を2e7までにしたらJVM抜きで120MB以上メモリを食っていました。BooleanをIntにしたら170MB以上。理屈はよくわからないけど、Scalaは(Javaは?)相当なメモリ食い虫のようですね。