ここで何が起こっているのか理解できるように助けてくれる人がいますか?私は素数を生成するためのこの定義を持っている:"。"のないスカラ関数呼び出し(ドット)と "。
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)
}
}
あなたが見ることができるように、両方の定義は、二番目のは、最初のに対し、フィルタの前に.
を持っていないという事実を除いて、正確に似ています1つです。
問題は最初のものを実行しているということです、期待通りに動作し、私たちの素数を与えるが、もう一つはjava.lang.StackOverflowError
を生成します。 誰かがこれにいくつかの光を当てることができますか?どちらの場合でもフィルタに渡されるのは何ですか?
Scalaのバージョン:2.11.6
Javaバージョン:1.8.0_121
これは私が一つ一つテストするために使用される完全なプログラムです:
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)
}
}
Scalaのどのバージョンですか? 'java.lang.StackOverflowError'は定義時にポップアップするか、ストリームのメンバーにアクセスしようとしたときですか?どちらのバージョンがevan058 @ Scalaの2.11 –
に私のために正常に動作し、私のScalaのバージョンは2.11.6で、Javaのバージョンがevan058 @ 1.8.0_121 – smac89
である私は、2.12.1にエラーを再現することができます。私はなぜそれが起こらないのか分からない2.11。あなたは実際にリストを使用しましたか、それとも定義しましたか? – sepp2k