Scala Stream [Int] #foldLeft и Stream [Int] #sum дают разные результаты - PullRequest
4 голосов
/ 18 января 2012

Этот вопрос относится к сумме простых чисел в проекте Эйлера и к 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.

1 Ответ

11 голосов
/ 18 января 2012

Проблема, кажется, переполнена.Они дают те же результаты для меня:

(primes map (_.longValue) takeWhile (_ < 2000000)).sum
(primes map (_.longValue) takeWhile (_ < 2000000)).foldLeft(0L)(_ + _)

Полагаю, разница между sum и foldLeft заключается в том, что тип результата sum совпадает с типом суммируемых элементов.(в соответствии с Числовой признак ), но foldLeft может иметь другой тип результата, который вы получите, написав 0L.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...