Quelqu'un peut-il m'aider à comprendre ce qui se passe ici. J'ai cette définition pour générer des nombres premiers :
def primes: Stream[Long] = {
2 #:: 3 #:: 5 #:: 7 #::Stream.iterate(11L)(_ + 2) filter {
n => primes takeWhile (p => p*p <= n) forall (n % _ != 0)
}
}
def primes: Stream[Long] = {
2 #:: 3 #:: 5 #:: 7 #::Stream.iterate(11L)(_ + 2) filter {
n => primes takeWhile (p => p*p <= n) forall (n % _ != 0)
}
}
Comme vous pouvez le voir, les deux définitions sont exactement similaires, sauf que la seconde n'a pas de .
avant filter, tandis que la première en a un.
Le problème est que l'exécution de la première fonctionne comme prévu et nous donne des nombres premiers, mais la seconde génère une java.lang.StackOverflowError
. Quelqu'un pourrait-il éclairer ma lanterne ? Que se passe-t-il dans chaque cas?
Version de Scala : 2.11.6
Version de Java : 1.8.0_121
Voici le programme complet que j'ai utilisé pour tester chacun :
object Main {
def primes: Stream[Long] = {
2 #:: 3 #:: 5 #:: 7 #::Stream.iterate(11L)(_ + 2) filter {
n => primes takeWhile (_ <= sqrt(n)) forall (n % _ != 0)
}
}
def primes2: Stream[Long] = {
2 #:: 3 #:: 5 #:: 7 #::Stream.iterate(11L)(_ + 2).filter {
n => primes2 takeWhile (p => p*p <= n) forall (n % _ != 0)
}
}
def main(args: Array[String]): Unit = {
println(primes.take(args.head.toInt).force)
}
}