Этот вопрос относится к сумме простых чисел в проекте Эйлера и к Stream.view , но в этом есть некоторая проблема. Я хочу посчитать сумму всех простых чисел ниже двух миллионов. Я создаю генератор простых чисел, определенных как:
lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
primes.takeWhile(j => j * j <= i).forall(i % _ > 0))
Я написал два теста, один с использованием Stream [Int] #foldLeft и один с использованием Stream [Int] #sum:
@Test
def testEuler010a {
primes.view.takeWhile(_ < 2000000).foldLeft(0L)(_ + _) mustEqual 142913828922L
}
@Test
def testEuler010b {
primes.view.takeWhile(_ < 2000000).sum mustEqual 142913828922L
}
testEuler010a
дает мне правильный ответ, тогда как testEuler010b
не дает ответа 1179908154
. Я ожидаю, что Stream[Int]#foldLeft(0L)(_ + _)
будет идентичным Stream[Int].sum
, но это не так. Даже если я материализую поток с toList()
, я получаю такое же расхождение. Это неверное предположение, что эти методы должны давать тот же результат?
Я использую Scala 2.9.1.final.