Scala Stream [Int] #foldLeft和Stream [Int] #sum给出不同的结
发布时间:2020-12-16 18:22:06 所属栏目:安全 来源:网络整理
导读:这个问题与 euler project sum-of-primes,and Stream.view有关,但有一点扭曲.我想计算低于200万的所有素数的总和.我创建了一个素数生成器,定义为: lazy val primes: Stream[Int] = 2 #:: Stream.from(3).filter(i = primes.takeWhile(j = j * j = i).forall
这个问题与
euler project sum-of-primes,and Stream.view有关,但有一点扭曲.我想计算低于200万的所有素数的总和.我创建了一个素数生成器,定义为:
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()实现Stream,我也会遇到相同的差异.这些方法应该给出相同的结果是不正确的假设吗? 我正在使用Scala 2.9.1.final. 解决方法
问题似乎是溢出.这些给我的结果相同:
(primes map (_.longValue) takeWhile (_ < 2000000)).sum (primes map (_.longValue) takeWhile (_ < 2000000)).foldLeft(0L)(_ + _) 我认为sum和foldLeft之间的区别在于sum的结果类型与被求和的元素的类型相同(根据Numeric trait的要求),但foldLeft可以有不同的结果类型,您可以通过编写0L来实现. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |