Scala Stream [Int] #foldLeft和Stream [Int] #sum给出不同的结果

and*_*nka 5 scala

这个问题涉及到euler项目的素数和Stream.view,但有一点扭曲.我想计算低于200万的所有素数的总和.我创建了一个素数生成器,定义为:

lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
  primes.takeWhile(j => j * j <= i).forall(i % _ > 0))
Run Code Online (Sandbox Code Playgroud)

我写了两个测试,一个使用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
 }
Run Code Online (Sandbox Code Playgroud)

testEuler010a给我正确的答案,而testEuler010b没有回答1179908154.我希望这Stream[Int]#foldLeft(0L)(_ + _)会是相同的Stream[Int].sum,但事实并非如此.即使我用a实现了Stream toList(),我也有同样的差异.这些方法应该给出相同的结果是不正确的假设吗?

我正在使用Scala 2.9.1.final.

Owe*_*wen 12

问题似乎是溢出.这些给我的结果相同:

(primes map (_.longValue) takeWhile (_ < 2000000)).sum
(primes map (_.longValue) takeWhile (_ < 2000000)).foldLeft(0L)(_ + _)
Run Code Online (Sandbox Code Playgroud)

我想之间的差sumfoldLeft是的结果类型sum是相同的被求和(所要求的元件的类型数值的性状),但foldLeft可以有不同的结果类型,它可以通过编写实现0L.