Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中计算素数流的代码_Scala - Fatal编程技术网

在Scala中计算素数流的代码

在Scala中计算素数流的代码,scala,Scala,我对Daniel Sobral的primeStream函数做了一些修改: 我将其用于: primeStream(Stream.from(2)).take(100).foreach(println) 它工作得很好,但我想知道我是否可以通过以下方法摆脱讨厌的流 def primeStream: def primeStream: () => Stream[Int] = () => Stream.from(2) def primeStream: Stream[Int] =>

我对Daniel Sobral的prime
Stream
函数做了一些修改:

我将其用于:

primeStream(Stream.from(2)).take(100).foreach(println)
它工作得很好,但我想知道我是否可以通过以下方法摆脱讨厌的

def primeStream: def primeStream: () => Stream[Int] = 
  () => Stream.from(2)  

def primeStream: Stream[Int] => Stream[Int] =
  s => s.head #:: primeStream(s.tail filter(_ % s.head != 0))
实现:

primeStream().take(100).foreach(println)
但这不起作用。我错过了什么

我也试过:

def primeStream: Stream[Int] => Stream[Int] = {
  () => Stream.from(2)
  s: Stream[Int] => s.head #:: primeStream(s.tail filter(_ % s.head != 0))
}
这不管用

这项工作:

def primeStream2(s: Stream[Int] = Stream.from(2)): Stream[Int] =
  s.head #:: primeStream2(s.tail filter(_ % s.head != 0))

但是,我想了解我错过了什么,以使语法适用于上面更对称的语法,使用了两个并行的
primeStream

的定义。第一次尝试不起作用,因为您试图用相同的名称定义两个不同的方法。无法根据返回类型区分方法。此外,除了他们的名字,他们似乎是完全无关的,所以如果你能调用其中一个,另一个的存在将是无关紧要的

第二次尝试将两个不相关且未命名的函数放在同一代码块中。如果将第一个函数用括号括起来,但结果不是您想要的,那么它将被编译

我完全理解您希望使
流.from(2)
自动,因为如果您传递任何其他内容,例如
Stream.from(13)
,您不会得到一个素数整数的

有几种不同的方法可以只通过一次
调用获得一个惰性素数序列。这一个有点复杂,因为它试图减少搜索下一个素数时的内部迭代次数

val primeStream: Stream[Int] = 2 #:: Stream.iterate[Int](3)(x =>
  Stream.iterate(x+2)(_+2).find(i => primeStream.takeWhile(p => p*p <= i)
     .forall(i%_ > 0)).get)
请注意,自Scala 2.13以来,
Stream
已被弃用,应替换为新的
LazyList

val primeStream: Stream[Int] = 2 #:: Stream.iterate[Int](3)(x =>
  Stream.iterate(x+2)(_+2).find(i => primeStream.takeWhile(p => p*p <= i)
     .forall(i%_ > 0)).get)
val primes = Stream.unfold(List(2)) { case hd::tl =>
  Option((hd, Range(hd+1, hd*2).find(n => tl.forall(n % _ > 0)).get::hd::tl))
}